c++ - 在基类 vector 上调用虚函数

标签 c++ virtual

我创建了一些代码来重现该问题:

#include "stdafx.h"
#include <iostream>
#include <vector>

class A
{
protected:
    int m_X;
public:
    A() { 
        std::cout << "in A ctor" << std::endl; 
        m_X = 0;
    }
    virtual void printX(){ std::cout << "in A " << m_X << std::endl; }
};

class B : public A
{
public:
    B() {
        std::cout << "in B ctor" << std::endl; 
        m_X = 1;
    }
    virtual void printX(){ std::cout << "in B " << m_X << std::endl; }
};

class As
{
public:
    void AddA( const A &a ){ m_As.push_back( a ); }
    void PrintXs()
    {
        for ( auto a : m_As )
        {
            a.printX();
        }
    }
private:
    std::vector<A> m_As;
};

int _tmain(int argc, _TCHAR* argv[])
{
    As as;
    B b;
    as.AddA( b );
    as.PrintXs();
    system("pause");
    return 0;
}

这个的输出是:

Actor

在 B 构造函数中

在 A 1

我想要“在 B 1 中”而不是“在 A 1 中”。我确信我对虚拟的理解是有缺陷的。我必须如何更改代码以调用 B PrintX()?请注意,还会有其他类继承自 A,因此我真的不想编写静态调用代码。

谢谢。

最佳答案

你正在做的叫做slicing .这是您获取派生类的对象并删除父类中不存在的所有内容并将其分配给父类的地方。

你想要做的是使用 polymorphism做你解释的事情。为此,将 vector 从对象的拷贝更改为对象的指针。

如果对更多细节感兴趣,请使用提供的链接,其中包含的信息似乎非常完整。

关于c++ - 在基类 vector 上调用虚函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16326657/

相关文章:

c++ - 从头开始实现经典 OPC DA 服务器

c++ - 使用 lambdas 初始化多维数组

c++ - UTF-8 字符的预处理器粘贴在 g++ 中执行 'not give a valid preprocessing token'

c++ - 在arm chromebook上编译taskwarrior的未定义引用

c++ - 需要一个虚拟模板成员解决方法

c++ - 无法在单独的函数中调用 ifstream

c++ - 派生类中何时实际需要 "virtual"属性?

c++ - 虚拟的概念

c++ - 不能将变量声明为类型,因为以下虚函数是抽象的

c++ - 覆盖虚拟成员函数时,为什么覆盖函数总是变为虚拟?