c++ - 在基类的复制构造函数上调用虚方法时多态性不启动

标签 c++ inheritance polymorphism

<分区>

我有以下 C++ 代码:

#include <iostream>

class Base {
public:
  Base() { }
  Base(const Base& other) { this->foo(); }
  virtual ~Base() { }
  virtual void foo() { std::cout << "Base::foo" << std::endl; }
};

class My : public Base {
public:
  My() : Base() { }
  My(const My& other) : Base(other) { }
  virtual ~My() { }
  void foo() { std::cout << "My::foo" << std::endl; }
};

int main(int argc, char** argv);

int main(int argc, char** argv) {
  My* my = new My();
  My* my2 = new My(*my);
}

My 继承自 Base。重要的是 Base 有一个虚方法 foo,它在 My 中被覆盖。

多态性没有发挥作用

Base 的复制函数中,由 My 的复制函数调用,我调用 foo。但是我希望 Base::Base(const Base&) 调用 My::foo,但是在运行程序时我得到:

Base::foo

为什么会这样?多态性应该调用 My::foo 吗?

最佳答案

动态调度在构造和销毁期间被禁用。这是设计使然。在 Base 构造函数中,对象的 My 部分尚未构造,因此调用 My 的覆盖程序没有意义,它可能会访问 My 的未初始化成员,或者依赖于 My 的不变量,因为 My 的构造函数尚未建立尚未完成。

如果这给您带来问题,您必须具体解释您想要的结果(发布新问题),以便建议解决方法。

关于c++ - 在基类的复制构造函数上调用虚方法时多态性不启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30087740/

相关文章:

在字符串中打印出 C++ 整数数字?

c++ - 在具有 1GB RAM 的机器上对 1TB 文件进行排序

c++ - 如何拆分 wstring

php - 如何调用 protected 函数?

php - Laravel 多态关系 : Passing model to controller

c++ - C++ 程序的 Web 界面

c# - 我可以在 C# DocumentDb 驱动程序中使用多态/继承吗

scala - `extends` 允许调用特征中的父类(super class)型方法,但不允许自身类型

java - 多态和抽象父类

java - ArrayList和List接口(interface)多态?