继承的构造函数无法初始化抽象类的继承成员

时间:2010-12-17 15:07:29

标签: c++ visual-c++ constructor abstract-class

class CarPart
{
public:
    CarPart(): name(""), price(0) {}
    virtual int getPrice() = 0;//{return price;}
protected:
    int price;
    string name;
};

class Tire: public CarPart
{
public:
    virtual int getPrice() {return price;}
    Tire(): CarPart(), name("Tire"), price(50)
    {}
};

Visual 2010告诉我名称和价格不是衍生的成员,但它们是继承的(错误c2614)。 我做错了什么?

4 个答案:

答案 0 :(得分:8)

您无法初始化不是您班级的直接成员的成员。 n不是deriv的直接成员,而是base的直接成员。

但是,n可以访问deriv,因此您始终可以在deriv构造函数中进行分配,但您应该在base构造函数中对其进行初始化。 / p>

此外,您不能拥有virtual个构造函数。您的意思是使用virtual析构函数吗?

class base
{
public:
    base() : n(0) {} // Are you sure you don't want this?
    virtual void show() = 0;
protected:
    int n;
};

class deriv : public base
{
public:
    deriv() 
    {
        n = 0;
    }

    virtual void show() {}
};

编辑(对OP编辑的回复):您不需要虚拟方法:

class CarPart
{
public:
    CarPart(const char* newName, int newPrice) : name(newName), price(newPrice) {}

    const std::string& GetName() const { return name; }
    int GetPrice() const               { return price; }
private:
    std::string name;
    int price;
};

class Tire : public CarPart
{
public:
    Tire() : CarPart("Tire", 50) {}
};

假设您的所有CarPart都必须有名称和价格,这应该足够了。

答案 1 :(得分:2)

1)n在基础中未初始化;

2)virtual deriv(): n(0) {}不是构造函数

你可能想要:

class base
{
public:
   base(int n) : n(n) {}

...

class deriv: public base
{
public:
deriv(): base(0) {}
...

答案 2 :(得分:1)

注意,构造函数不能是虚拟的!

您无法使用成员初始化语法初始化基类的成员。在基类中初始化n(这是正确的方法):

class base 
{ 
public: 
    base(int n_ = 0) : n(n_) {}
    virtual void show() = 0;  
protected: 
    int n; 
}; 

class deriv: public base 
{ 
public: 
    deriv() : base(0) {} 
    void show() {} 
}; 

或在派生类的构造函数内为n赋值(不好,至少在基类没有初始化的情况下:

class base 
{ 
public: 
    base(int n_ = 0) : n(n_) {}
    virtual void show() = 0;  
protected: 
    int n; 
}; 

class deriv: public base 
{ 
public: 
    deriv() { n = 1; } 
    void show() {} 
}; 

答案 3 :(得分:0)

您无法在派生类中初始化基类成员,因为在初始化派生类之前已经构造了基类。您可以提供一个构造函数,该构造函数接受n的值的参数:

base(int val) : n(val) {}

然后在deriv构造函数中委托给它:

deriv() : base(0) {}