簡體   English   中英

如何在矢量中存儲多個派生類而不進行切片

[英]How to store multiple derived classes in a vector without slicing

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

在基類中將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_func\n";
}

void Base::non_virtual_func() {
    cout << "Base::non_virtual_func()\n";
}


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

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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM