我的问题是,为什么我不能把通过指针保护在派生类中虚函数的基类,除非声明派生类的基类的朋友吗?C++保护成员继承
例如:
#include <iostream>
class A {
friend class C; // (1)
protected:
virtual void foo() const = 0;
};
class B : public A {
void foo() const override { std::cout << "B::foo" << std::endl; }
};
class C : public A {
friend void bar(const C &);
public:
C(A *aa) : a(aa) { }
private:
void foo() const override {
a->foo(); // (2) Compile Error if we comment out (1)
//this->foo(); // (3) Compile OK, but this is not virtual call, and will cause infinite recursion
std::cout << "C::foo" << std::endl;
}
A *a;
};
void bar(const C &c) {
c.foo();
}
int main() {
B b;
C c(&b);
bar(c);
return 0;
}
输出是
B::foo
C::foo
在上面的代码中,我想通过C
类(的构件a
调用虚函数foo()
不是静态绑定一个通this
在编译时),但如果我不作C
为A
的朋友,电话是违法的。
我认为C
从A
继承的,所以它可以访问的A
的protected
成员,但为什么它实际上不会发生呢?
那么,在技术上,'A-> FOO();'不是虚拟呼叫任一。要在你的基类中调用'foo'方法,可以这样调用它:'A :: foo();'。 –
@AlgirdasPreidžius通过指向基类的指针调用不是虚拟调用?此外,'A :: foo'是没有定义一个纯虚函数,我觉得像'A.A :: foo'通话是在编译时的约束,将是这种情况的一个错误。 – Jaege
@AlgirdasPreidžius否,如OP表明,'A-> FOO()的结果是''B :: foo'。 – songyuanyao