2017-08-29 104 views
3

有没有办法根据其他调用来替换可能的基类的多个函数的“堆栈继承”类型?来自多个类的C++多态性

例如像:

class Base { 
     void func1(){/* do something */} 
     void func2(){/* do something */} 
}; 
class A1 { 
     void func1(){/* do something else */} 
}; 
class A2 { 
     void func2(){/* do something else */} 
}; 

int main(){ 
    A1 a1obj = new A1(); 
    A2 a2obj = new A2(); 
    Base obj = new Base(); 

    obj = &a1obj; 
    obj = &a2obj; 
    obj.func1(); //now A1::func1() 
    obj.func2(); //now A2::func2() 
} 

谢谢

+0

打开你的C++的书,介绍了如何使用'章std :: function',并读取它。 –

+0

是的,但是你的函数需要是虚拟的,你需要从基类派生出来,如果你使用多态的基类型来工作,你需要使用指针或引用。 –

+0

这可能会通过阅读一些好的初学者书籍来解答(http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)。 –

回答

1

有虚函数和多重继承在C++(这应尽量避免)。

什么,你可以在这种情况下,做的是:

class Base { 
     virtual void func1(){/* do something */} 
     virtual void func2(){/* do something */} 
}; 
class A1: public Base { 
     void func1() override {/* do something else */} 
}; 
class A2: public A1 { 
     void func2() override {/* do something else */} 
}; 

int main(){ 
    A2 a2obj; 
    Base* obj = &a2obj; 

    obj->func1(); //now A1::func1() 
    obj->func2(); //now A2::func2() 
} 

你甚至可以跳过实例的基础对象,只是做

int main(){ 
    A2 obj; 

    obj.func1(); //now A1::func1() 
    obj.func2(); //now A2::func2() 
} 
+2

它不只是*可以跳过*,它*必须跳过*。否则在你的例子中'Base'就会泄露。 – spectras