在基类向量上调用虚函数

Phl*_*das 2 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;
}
Run Code Online (Sandbox Code Playgroud)

这个输出是:

在一个ctor

在B ctor

在A 1

我想要"在B 1"而不是"A 1".我确信我对虚拟的理解是有缺陷的.如何更改代码以调用B PrintX()?请注意,将有其他类继承自A,所以我真的不想编写静态调用.

谢谢.

Dav*_*d D 6

你正在做的是切片.这是您获取派生类的对象并修剪不在父级中的所有内容并将其分配给父级的位置.

你想要做的是使用多态来做你解释的.要执行此操作,请将矢量从对象的副本更改为ptr到对象.

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