Если класс наследуется как 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]. — Кодт
Здравствуйте, 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 затащил пример, и ругань была понятна и ожидаема, тем самым вы облегчите и ускорите ответ на ваш вопрос:
C:\Documents and Settings\ebalovnev\My Documents\A_Proj\rsdn051115\rsdn051115.cpp(31) : error C2248: 'bf' : cannot access protected member declared in class 'B'
Здравствуйте, 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 получаем ошибку.
Спасибо большое за ответ!

Надо мне наверно какиенить пилюли пить от торможения.
Пасибо бальшое за ответ!

Постараюсь в будущем так сильно не тормозить.