При обработке такого файла определения



Листинг 7.3. Файл nixon.h. Объявление классов, версия 2

class Person

public:

Person)) {};

virtual "Person)) {};

virtual void speak)){ cout « "Beer";}

};

class Republican : public Person

public:

Republican)) {}; virtual ~Republican)) {};

class Quaker : public Person

public:

Quaker)) {};

virtual ~Quaker)) {};

class Republican Quaker : public Republican, public Quaker

{

public:

Republican_Quaker( ) {} ;

virtual ~Republican_Quaker( ) {};

}

При обработке такого файла определения компилятор опять выдаст сообщение о неоднозначности ссылки на метод speak ( ). Это произойдет по той причине, что компилятор сформирует две копии объявления класса Person — по одной для каждого пути наследования, а это приведет к конфликту имен. Чтобы устранить эту неоднозначность, нужно объявить Person как виртуальный базовый класс и для Republican, и для Quaker. Тогда оба производных класса будут ссылаться на единственный объект суперкласса (листинг 7.4).





Содержание раздела