【问题标题】:Why when I try to print an attribute from base clase ,it is always 0 ? in c++为什么当我尝试从基类打印属性时,它总是 0 ?在 C++ 中
【发布时间】:2020-09-07 09:48:15
【问题描述】:

我有一个基类

class Servicii{
protected:
    double price;
public:
    Servicii(double p):price(p){}
    double getPrice(){return price;}

还有3个派生类CarBookHouse。因为是派生类,所以都会有价格


class House:public Servicii{
private:
    int level;
public:
    House(double p,int l):
          Servicii(price),level(l){}

我主要创建一些像这样的对象:

House *h1=new House(600,3);
Book *b1=new Book("Dostoievski","Crima si Pedeapsa",5,98.5);

我的问题是当我打印时价格总是 0。例如房子的价格是 600,但是当我打印时它是 0,我不知道为什么。 我在 Servicii 中创建了一个打印函数,所有派生类都继承了这个函数+它们打印自己的属性。

【问题讨论】:

  • House的成员初始化器中不应该是Servicii(p)吗?请提供mre
  • 只是看起来像一个错字,但这个错字是在这篇文章中,还是在实际代码中?
  • 打开编译器警告。任何编译器都应该警告你不要使用p。 Clang 乐于助人points out the use of an uninitialized variable.

标签: c++ inheritance printing derived-class


【解决方案1】:

在这个构造函数中:

House(double p,int l):
          Servicii(price),level(l){}

您正在使用基类成员price 来初始化Servicii。这是不正确的,实际上在基类完全初始化之前访问该成员是未定义的行为。

您只需要使用值p 来初始化Servicii

House(double p,int l):
          Servicii(p),level(l){}

如果您打开编译器警告,您将收到有关犯此类错误的警告。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多