C++:在 OBJ、OBJ&、const OBJ& 上调用时实现不同的方法
Posted
技术标签:
【中文标题】C++:在 OBJ、OBJ&、const OBJ& 上调用时实现不同的方法【英文标题】:C++: Implement different methods when called on OBJ, OBJ&, const OBJ& 【发布时间】:2018-01-20 15:48:07 【问题描述】:有没有办法(我怀疑它涉及继承和多态性)区分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
【问题讨论】:
这没有多大意义。无论异常类型如何,第一个catch
子句将捕获它,或者三个都不会。对我来说看起来像 XY problem。
不,你有什么背景说明你为什么想要那个吗?
你们说的都对,我会在几分钟内澄清这个问题。
澄清了,你能再看看吗?
【参考方案1】:
是的,通过多态性,您可以使具有相同标头(声明)的函数采用不同的形式(这就是这个词的含义 - polys,“许多,很多”和 morphe,“形式,形状” em>),在我们的例子中,执行不同的指令。当然,函数必须是两个类的方法,其中一个继承另一个。每个类都应根据需要实现功能。此外,您将对基类的引用实际上引用派生类的对象(多态 - 相同的东西,多种形式),从而获得所需的行为。
考虑以下代码:
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;
输出将是:
我是来自 BaseClass 的函数“调用” 我是来自 DerivedClass1 的函数“调用” 我是来自 DerivedClass2 的 const 函数“调用”
注意 BaseClass 中有 2 个虚函数,因为
void call() const
不同于
void call()
您可以在此处阅读有关多态性的更多信息:
https://www.geeksforgeeks.org/virtual-functions-and-runtime-polymorphism-in-c-set-1-introduction/
【讨论】:
【参考方案2】:您可以让成员调用左值引用和右值引用之间的区别,但如果您有一个“void member() const &”,则不能有一个普通的“void member() const”,但是你可以有一个“void member” () 常量 &&"。
【讨论】:
以上是关于C++:在 OBJ、OBJ&、const OBJ& 上调用时实现不同的方法的主要内容,如果未能解决你的问题,请参考以下文章