继承和功能

时间:2017-09-01 13:32:45

标签: c++ inheritance

#include<iostream>


class A {
    protected:
        int x;
    public:
        A(int n){
            x = n;
        }

        int getX(){return x;}

        static A add(A a, A b){
            return A(a.getX() + b.getX()); 
        }

        void print(){
            std::cout << x;
        }
};

class B : public A {
    public:
        B(int x) : A(x){

        };
};


int main(){
    B a(10), b(10);

    B c = A::add(a, b);
    c.print();

    int d;
    std::cin >> d;
    return 0;
}

对于此代码段,我收到错误

  

main.cpp:在函数'int main()'中:   main.cpp:34:17:错误:请求从'A'转换为非标量类型'B'        B c = A::add(a, b);

我理解错误的错误,因为当参数是A类时,我无法传递B类对象。

我想知道是否有任何方法,例如B c = A::add(a.super (), b.super());或类似的内容?

虽然我可以通过删除继承并在B类中创建A的对象来轻松地在我的实际程序中消除此错误,但我仍然希望在我的程序中使用继承。

1 个答案:

答案 0 :(得分:2)

类型兼容性正在提升。如果B派生自A,则任何类型B的对象都可以转换或查看为A类型的对象,但不能反过来。想想汽车和汽车。任何汽车都是汽车,但不是所有的汽车都是汽车,有些是飞机。

这里的问题是该方法声明返回一个类型为A的对象,但是赋值的目标是B类。在这里不能保证将类型A的对象转换为类型B的对象,因此编译器会抱怨。 / p>

写:

A c = A::add(a,b);

并且编译器将保持沉默。

现在我明白你需要多态性;为此,您需要使用指针或引用。但由于你的问题没有真正指明,我对此无法帮助你。