#include <iostream>
struct MemA { virtual void tellClass() { std::cout << "I am member of class A" << std::endl; } };
struct MemB : public MemA { void tellClass() { std::cout << "I am member of class B" << std::endl; } };
class A {
MemA *current;
public:
A() : current(new MemA()) {}
void getMemClass() { current->tellClass(); }
~A() { delete current; }
};
class B : public A {
MemB *current;
public:
B() : A(), current(new MemB()) {}
~B() { delete current; }
};
void main() { B().getMemClass(); }
在上面的程序中,我已经将tellClass()
函数声明为虚拟函数,这意味着它应该决定在运行时调用哪个函数。尽管如此;我是A类的成员;即使我从在继承期间用CCD_ 4隐藏了CCD_ 3的类B对象调用CCD_。
如何使其正常工作?
A
中的current
与B
中的current
是不同的成员,即有两个成员A::current
和B::current
。CCD_ 11有他们两个作为成员。
前者仅隐藏在中,因为在类B
的上下文中命名current
不合格是指B::current
而不是A::current
。在类A
的上下文中(您正在评估调用current->tellClass();
(,非限定名称仍然指A::current
成员。
C++中的数据成员不能像(虚拟(成员函数那样被重写。
getMemClass()
0对象的A::current
成员指向的是MemA
完整对象,而不是MemB
对象。