我想將一些子類描述的元素添加到一個向量中,遍歷它們調用一個重寫的方法,並希望它在可能的情況下調用重寫的方法。但是我發現它似乎只是調用超類方法。從超類的向量中調用子類方法C++
我學習了Java並且不確定它爲什麼在C++中這樣做。我嘗試使用超類的指針向量重寫代碼,並將子類的指針投射到超類。通過指針訪問這個工作。
理想情況下,我不想要將指針列表放入向量中,因爲此後我必須手動刪除每個(我相信?)以阻止內存泄漏,因爲我將用new創建對象,以便它們保持過去該方法調用將它們添加到向量中。
有沒有更好的方法來做到這一點,或者我堅持使用指針,並調用刪除創建的對象時父類不需要?最好的載體是類X的一個列表,而不是X類的指針列表
我的結構是:
class a { vector vec of class X,
method to create and add an instance of X into vector vec,
method to create and add an instance of Y into vector vec }
class X { talk() }
class Y : public X { talk() }
代碼來說明什麼,我非常想做的事,但顯示出其只破父類方法:
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <vector>
class A {
public:
virtual void talk() { printf("A\n"); }
};
class B: public A {
public:
void talk() { printf("B\n"); }
};
int main(void) {
std::vector<A> vec;
std::vector<A*> vec2;
A a;
B b;
a.talk();
b.talk();
vec.push_back(a);
vec.push_back(b);
vec2.push_back(&a);
vec2.push_back(&b);
for(int i = 0; i < vec.size(); i++) {
vec[i].talk();
vec2[i]->talk(); //bad but short for example
}
}
你確實需要指針(可能是智能指針,比如'std :: unique_ptr')才能獲得多態行爲。參見[「對象切片」](http://en.wikipedia.org/wiki/Object_slicing)。它在Java中工作,因爲'MyClass obj'有效地聲明瞭一個指向'MyClass'的指針。 –
'talk()'在'A'中不是虛擬的,所以沒有方法可以覆蓋。編譯器將使用什麼是靜態類型,即「A」。 – 0x499602D2
@ 0x499602D2此代碼的第一個版本中的錯誤,已修復,已添加虛擬,仍未按預期工作。 – Chewett