Visual Studio 2015 ошибка? Неоднозначный доступ к функциям-членам, порядок переопределения классов предков с помощью оператора

Я что-то упустил или обнаружил ошибку в Visual Studio?

Ошибки в стороне, использование этого типа наследства - ОК или зло?

GCC 4.9.0 дает мои ожидаемые результаты:

base.getProperty() 1
otherBase.getProperty() 2
derivedA.getProperty() 1
derivedB.getProperty() 2

Но и VS 2015 (CTP 6), и VS 2013 (Update 5 CTP) дают неправильные результаты:

base.getProperty() 1
otherBase.getProperty() 2
derivedA.getProperty() 1
derivedB.getProperty() 1

Изменение "class производного класса: открытого производного класса, другого производного класса {" на "класса производного класса: открытого другого класса, производного класса {" приводит к моим ожидаемым результатам. Я мог что-то упустить, но хотя порядок наследуемых классов повлияет на порядок инициализации, я не думаю, что он должен влиять на то, какую неоднозначную функцию использовать, особенно когда есть оператор using для прояснения существующей неоднозначности.

#include <iostream>
using namespace std;

class baseClass {
public:
    virtual int getProperty() {
        return 1;
    }
};

class otherBaseClass : public baseClass {
public:
    virtual int getProperty() {
        return 2;
    }
};

class derivedClassA : public baseClass {
public:
    void someUniqueThing() {
        cout << "someUniqueThing" << endl;
    }
};

class derivedClassB : public derivedClassA, otherBaseClass {
public:
    using otherBaseClass::getProperty;
};

int main() {
    baseClass base;
    cout << "base.getProperty() " << base.getProperty() << endl;
    otherBaseClass otherBase;
    cout << "otherBase.getProperty() " << otherBase.getProperty() << endl;
    derivedClassA derivedA;
    cout << "derivedA.getProperty() " << derivedA.getProperty() << endl;
    derivedClassB derivedB;
    cout << "derivedB.getProperty() " << derivedB.getProperty() << endl;
}

0 ответов

Другие вопросы по тегам