如何存储多个派生类在一个矢量没有切片

How to store multiple derived classes in a vector without slicing

本文关键字:一个 切片 派生 何存储 存储      更新时间:2023-10-16
class Base
{
    public :
        void func()
        {
            cout << "Base func()" << endl;
        }
};
class DerivedA : public Base
{
    public :
        void func()
        {
            cout << "Derived A func()" << endl;
        }
};
class DerivedB : public Base
{
    public :
        void func()
        {
            cout << "Derived B func()" << endl;
        }
};
void main()
{
    DerivedA a;
    DerivedB b;
    vector<shared_ptr<Base>> temp;
    temp.push_back(make_shared<DerivedA> (a));
temp.push_back(make_shared<DerivedB> (b));
    for(auto ptr : temp)
    ptr->func();
}

输出为

Base func()
Base func()

但我期望的是

Derived A func()
Derived B func()

我怎么能把派生类推到基类向量没有切片?如果没有办法解决这个问题,是否有任何等效的方法来存储多个派生类到一个数组,如对象?

没有切片。您需要在Base中设置func为虚拟:

virtual void func()
{
    cout << "Base func()" << endl;
}

告诉编译器在func中查找Base*的动态类型

使func()在基类中为虚函数

class Base
{
    public :
        virtual void func()
        {
            cout << "Base func()" << endl;
        }
};

你应该使用虚函数。



virtual_functions.h

#pragma once
class Base {
public:
    virtual void virtual_func();   // virtual function.
    void non_virtual_func();       // non-virtual function.
};
class Derived : public Base {
public:
    void virtual_func();          // virtual function.
    void non_virtual_func();      // non-virtual function.
};

virtual_functions.cpp

#include "virtual_functions.h"
#include <iostream>
using namespace std;
void Base::virtual_func() {
    cout << "Base::virtual_funcn";
}
void Base::non_virtual_func() {
    cout << "Base::non_virtual_func()n";
}

void Derived::virtual_func() {
    cout << "Derived::virtual_funcn";
}
void Derived::non_virtual_func() {
    cout << "Derived::non_virtual_func()n";
}

main.cpp

#include "virtual_functions.h"
int main() {
    // Declare an object of type Derived.
    Derived aDerived;
    // Declare two pointers,
    // one of type Derived * 
    // and the other of type Base *,
    // and initialize them to point to derived.
    Derived *pDerived = &aDerived;
    Base    *pBase    = &aDerived;
    // Call the functions.
    pBase->virtual_func();        // Call virtual function.
    pBase->non_virtual_func();    // Call nonvirtual function.
    pDerived->virtual_func();     // Call virtual function.
    pDerived->non_virtual_func(); // Call nonvirtual function.
    return 0;
}

输出应该是:

派生:virtual_func ()
基地:non_virtual_func ()
派生:virtual_func ()
派生:non_virtual_func ()