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)。 我做错了什么?
答案 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) {}