繁体   English   中英

为什么 virtual 不在这里调用覆盖的 function ?

[英]Why does virtual not call the overridden function here?

#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() function 声明为虚拟,这意味着它应该决定在运行时调用哪个 function。 尽管它正在打印“我是 class A 的成员”,即使我正在从 class B object 调用getMemClass() ,它在继承 MemB 期间隐藏了MemA *currentMemB *current

我怎样才能让它正常工作?

A中的currentB中的current是不同的成员,即有两个成员A::currentB::current B有他们两个作为成员。

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

C++ 中的数据成员不能像(虚拟)成员函数一样被覆盖。

B object 的A::current成员指向MemA完整 object,而不是MemB object。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM