[英]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.