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;
 }