C ++:在OBJ,OBJ&,const OBJ&上调用时实现不同的方法。

时间:2018-01-20 15:48:08

标签: c++ class polymorphism

有没有办法(我怀疑它涉及继承和多态)来区分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
}

2 个答案:

答案 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;”。