有没有办法(我怀疑它涉及继承和多态)来区分OBJ o, OBJ& o, const OBJ& o
?我希望在3个不同的程序中使用相同的代码,并使用相同的方法名称调用不同的方法。
int main(){
try{
// try something
}catch(OBJ o){
o.doSomething(); // Do action 1
}
return 0;
}
int main(){
try{
// try something
}catch(OBJ& o){
o.doSomething(); // Do action 2
}
return 0;
}
int main(){
try{
// try something
}catch(const OBJ& o){
o.doSomething(); // Do action 3
}
return 0
}
答案 0 :(得分:1)
是的,通过多态性,您可以使用相同的标题(声明)创建一个具有不同形式的函数(这意味着单词 - polys,"很多,很多"和morphe," form,shape" ),在我们的例子中,执行不同的指令。当然,该函数必须是两个类的方法,其中一个继承另一个类。每个类应根据需要实现该功能。此外,您将引用基类实际引用派生类的对象(多元素 - 相同的事物,多种形式),从而获得所需的行为。
请考虑以下代码:
class BaseClass{
public:
virtual void call() const { cout<<"I am const function 'call' from BaseClass\n"; };
virtual void call() { cout<<"I am function 'call' from BaseClass\n"; }
};
class DerivedClass1: public BaseClass{
public:
void call() { cout<<"I am function 'call' from DerivedClass1\n"; }
};
class DerivedClass2: public BaseClass{
public:
void call() const { cout<<"I am const function 'call' from DerivedClass2\n"; }
};
int main()
{
BaseClass b;
DerivedClass1 d1;
DerivedClass2 d2;
try{
throw b;
}
catch (BaseClass ex){
ex.call();
}
try{
throw d1;
}
catch (BaseClass& ex){
ex.call();
}
try{
throw d2;
}
catch (const BaseClass& ex){
ex.call();
}
return 0;
}
输出将是:
I am function 'call' from BaseClass I am function 'call' from DerivedClass1 I am const function 'call' from DerivedClass2
请注意,BaseClass中有2个虚函数,因为
void call() const
与
不同void call()
您可以在此处阅读有关多态性的更多信息:
https://www.geeksforgeeks.org/virtual-functions-and-runtime-polymorphism-in-c-set-1-introduction/
答案 1 :(得分:0)
你可以让成员在左值引用和右值引用之间进行区分,但是如果你有一个“void member()const&amp;”你不能有一个简单的“void member()const”,但你可以拥有“void member()const&amp;&amp;”。