наследование pure virtual functions
От: StudentFS  
Дата: 15.11.05 00:11
Оценка:
Если класс наследуется как public:
class A {
(private: or protected: or public:)
virtual void do_a() = 0;
};

class B : public A {
(private: or protected: or public:)
void do_a() { ... }
};

в базовом классе один из вариантов (private, protected, public) : virtual a()=0;, а в производном (private, protected, public) : virtual a() {...} то чё и как отнаследуется? Переопределяется ли тип дальнейшего наследования классом B? Если в классе A private: virtual a()=0 то как производный класс может переопределить?
Более конкретно сделал и то и то protected:
class A {
protected:
   void af() { do_af(); }

protected:
   virtual void do_af() = 0;
};

class B {
protected:
   void bf() { do_bf(); }

protected:
   virtual void do_bf() = 0;
};


class A1 : public A {
public:
   A1(B* b) : b_ (b) { }

protected:
   virtual void do_af() { b_->bf(); }

private:
   B* b_;
};

class B1 : public B {
protected:
   virtual void do_bf() { }
};
 
class C : public A1, public B1
{
public:
   C() : A1(this), B1() { }
};
 
int main () {

C x;

}

так компилятор ругается. А по обычным правилам наследования вроде бы не должен. Заранее пасибо!

Добавлено форматирование — тэг [c]. — Кодт
Re: наследование pure virtual functions
От: bedward70 Россия http://www.bedward70.narod.ru/
Дата: 15.11.05 05:59
Оценка:
Здравствуйте, StudentFS, Вы писали:

[skipped]

SFS>class B {

SFS>protected:
SFS> void bf() { do_bf(); }

SFS>protected:

SFS> virtual void do_bf() = 0;
SFS>};


SFS>class A1 : public A {

SFS>public:
SFS> A1(B* b) : b_ (b) { }

SFS>protected:

SFS> virtual void do_af() { b_->bf(); }

SFS>private:

SFS> B* b_;
SFS>};

В классе A1 в функции do_af ты обращаешься к protected функции класса В, а правов то и не хватает.
Выход очевиден:
Вариант А: сделать B::bf public.
Вариант Б: сделать класс A1 дружественным к классу B, что даст возможность использовать закрытые и защищенные методы и переменные класса. Пример:

class A1;

class B {
protected:
void bf() { do_bf(); }

protected:
virtual void do_bf() = 0;
friend A1;
};


[skipped]

С уважением, Эдвард
P.S.:
SFS>так компилятор ругается. А по обычным правилам наследования вроде бы не должен. Заранее пасибо!

Большая просьба указывать, как ругается компилятор, я в MVC++ 6 затащил пример, и ругань была понятна и ожидаема, тем самым вы облегчите и ускорите ответ на ваш вопрос:

С уважением, Эдвард
Re: наследование pure virtual functions
От: Кодт Россия  
Дата: 15.11.05 11:43
Оценка:
Здравствуйте, StudentFS, Вы писали:

class B {
protected:
   void bf() { do_bf(); }

protected:
   virtual void do_bf() = 0;
};

class A1 : public A {
public:
   A1(B* b) : b_ (b) { }

protected:
   virtual void do_af() { b_->bf(); }

private:
   B* b_;
};

Поскольку B::bf — protected, то доступ к нему имеют только сам B, его наследники и друзья. A1 не является ни тем, ни другим. Поэтому в A1::do_af получаем ошибку.
Перекуём баги на фичи!
Re: наследование pure virtual functions
От: Кодт Россия  
Дата: 15.11.05 11:46
Оценка:
Здравствуйте, StudentFS, Вы писали:

Ещё замечу в сторону (по поводу названия темы: наследование pure virtual functions)
Наследование и модификаторы доступа — взаимно-независимы.
Потому что модификаторы управляют доступом, но не видимостью (все члены всегда видны — независимо от доступа).
Перекуём баги на фичи!
Re[2]: наследование pure virtual functions
От: StudentFS  
Дата: 15.11.05 23:08
Оценка:
Спасибо большое за ответ! Надо мне наверно какиенить пилюли пить от торможения.
Re[2]: наследование pure virtual functions
От: StudentFS  
Дата: 15.11.05 23:11
Оценка:
Пасибо бальшое за ответ! Постараюсь в будущем так сильно не тормозить.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.