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& 上调用时实现不同的方法的主要内容,如果未能解决你的问题,请参考以下文章

通过 const 引用传递对象?

C++第10课 STL容器 (三1)

C++(三十六) — 等号操作符重载

js 浅析栈内存和堆内存

C++中const使用注意要点

C++ Basic 32 : C++常对象和常成员函数详解