为什么virtual不在这里调用被重写的函数


#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中的currentB中的current是不同的成员,即有两个成员A::currentB::current。CCD_ 11有他们两个作为成员。

前者仅隐藏在中,因为在类B的上下文中命名current不合格是指B::current而不是A::current。在类A的上下文中(您正在评估调用current->tellClass();(,非限定名称仍然指A::current成员。

C++中的数据成员不能像(虚拟(成员函数那样被重写。

getMemClass()0对象的A::current成员指向的是MemA完整对象,而不是MemB对象。

最新更新