C++ C++;:虚拟方法
我有以下代码(C++ C++;:虚拟方法,c++,inheritance,virtual-functions,C++,Inheritance,Virtual Functions,我有以下代码(#包括s和使用命名空间std省略): < >但是,我希望C++自动识别创建相应元素的类型。也就是说,我希望C++输出 I'm A I'm B I'm C (也就是说,编译器应该为我选择合适的子类。) 在这种情况下(即,如果所有元素都来自向量),这可能吗?成员函数只有当您从指向实际对象的指针调用它们时,而不是从对象本身调用它们时,虚拟性才起作用,因为在您的示例中,对象自动静态地向上转换为a类。请将代码更改为: std::vector<std::unique_ptr<A&
#包括s和使用命名空间std
省略):
< >但是,我希望C++自动识别创建相应元素的类型。也就是说,我希望C++输出
I'm A
I'm B
I'm C
(也就是说,编译器应该为我选择合适的子类。)
在这种情况下(即,如果所有元素都来自向量
),这可能吗?成员函数只有当您从指向实际对象的指针调用它们时,而不是从对象本身调用它们时,虚拟性才起作用,因为在您的示例中,对象自动静态地向上转换为a类。请将代码更改为:
std::vector<std::unique_ptr<A>> stuff = {
std::unique_ptr<A>(new A()),
std::unique_ptr<A>(new B()),
std::unique_ptr<A>(new C()),
};
stuff[0]->call();
stuff[1]->call();
stuff[2]->call();
std::vector stuff={
std::unique_ptr(新的A()),
std::unique_ptr(新的B()),
std::unique_ptr(新C()),
};
stuff[0]->call();
stuff[1]->call();
stuff[2]->call();
对于C++多态性,您应该使用指针或引用。你可以这样做
int main(){
vector<A*> stuff;
stuff.push_back(new A);
stuff.push_back(new B);
stuff.push_back(new C);
stuff[0]->call(); // output: I'm A
stuff[1]->call(); // output: I'm A
stuff[2]->call(); // output: I'm A
while (!stuff.empty()){
delete stuff.back();
stuff.pop_back();
}
return 0;
}
intmain(){
vector见:s/A*/std::unique_ptr/
…OP不一定知道智能指针,尤其是如果他问了这样一个基本的问题,那么现在是教他这些问题的时候了。在教他拥有原始指针之前,FFS。然后更重要的是不要从拥有原始指针开始。好的,伙计们,修正了。这是正确的ious版本在生产代码中是一件可怕的事情,但这只是一个例子。我将教训大家不要再显示此类示例警告!请看我答案的注释。您也有不安全的代码
std::vector<std::unique_ptr<A>> stuff = {
std::unique_ptr<A>(new A()),
std::unique_ptr<A>(new B()),
std::unique_ptr<A>(new C()),
};
stuff[0]->call();
stuff[1]->call();
stuff[2]->call();
int main(){
vector<A*> stuff;
stuff.push_back(new A);
stuff.push_back(new B);
stuff.push_back(new C);
stuff[0]->call(); // output: I'm A
stuff[1]->call(); // output: I'm A
stuff[2]->call(); // output: I'm A
while (!stuff.empty()){
delete stuff.back();
stuff.pop_back();
}
return 0;
}