gpt4 book ai didi

c++ - 继承和功能

转载 作者:行者123 更新时间:2023-11-30 03:29:04 25 4
gpt4 key购买 nike

#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: In function ‘int main()’: main.cpp:34:17: error: conversion from ‘A’ to non-scalar type ‘B’ requested B c = A::add(a, b);

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

我想知道是否有任何解决办法,比如 B c = A::add(a.super
(), b.super());
或类似的东西?

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

最佳答案

类型兼容性正在提升。如果 B 派生自 A,则任何类型 B 的对象都可以转换或视为类型 A 的对象,但反之则不行。想想汽车和交通工具。任何汽车都是交通工具,但并非所有交通工具都是汽车,有些是飞机。

这里的问题是方法声明返回一个A类型的对象,但是赋值的目标是B类型的。这里不能保证将A类型的对象转换为B类型的对象,所以编译器会报错。

写:

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

编译器将保持沉默。

现在我明白了你需要多态;为此,您需要使用指针或引用。但是由于您的问题并未真正说明,因此我无法在这方面为您提供更多帮助。

关于c++ - 继承和功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46001409/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com