#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的对象来轻松地在我的实际程序中消除此错误,但我仍然希望在我的程序中使用继承。
答案 0 :(得分:2)
类型兼容性正在提升。如果B派生自A,则任何类型B的对象都可以转换或查看为A类型的对象,但不能反过来。想想汽车和汽车。任何汽车都是汽车,但不是所有的汽车都是汽车,有些是飞机。
这里的问题是该方法声明返回一个类型为A的对象,但是赋值的目标是B类。在这里不能保证将类型A的对象转换为类型B的对象,因此编译器会抱怨。 / p>
写:
A c = A::add(a,b);
并且编译器将保持沉默。
现在我明白你需要多态性;为此,您需要使用指针或引用。但由于你的问题没有真正指明,我对此无法帮助你。