2014-12-13 91 views
0
class Base{ 
protected: 
    int remainItems = 0; 
public: 
    Base(){} 
    virtual int numOfItem() = 0; 
}; 
class Deveried1 : public Base{ 
public: 
    Deveried1() :Base(){ remainItems = numOfItem(); } 
    int numOfItem(){ 
     return 5; 
    } 
}; 
class Deveried2 : public Base{ 
public: 
    Deveried2() :Base(){ remainItems = numOfItem(); } 
    int numOfItem(){ 
     return 10; 
    } 
}; 
class Deveried3 : public Base{ 
public: 
    Deveried3() :Base(){ remainItems = numOfItem(); } 
    int numOfItem(){ 
     return 10; 
    } 
}; 
int main(){ 
    Base* foo = new Deveried3; 
} 

有了这样的设计,对于每一个deveried类,我都必须在构造函数中为initalize remainingItems做同样的事情。我想知道在这种情况下是否有更好的方式/模式。如何更改变量initializated取决于虚函数

+0

您不能在基类构造函数中调用虚函数。 – 2014-12-13 11:35:12

+0

这是什么方法?难道你不能只创建一个以'remainingItems'作为参数的第二个基类构造器吗? – nvoigt 2014-12-13 11:35:32

+0

该方法用于为不同的Deveried类存储numofItem,因此在开始时,remainingItems = numofItem。 – user2477 2014-12-13 11:38:17

回答

1

我没有看到任何方法的好处,所以我删除,并增加了一个选项来传递变量在基类的构造函数:

class Base{ 
protected: 
    int remainItems; 
public: 
    Base(remainItems = 0) { this->remainItems = remainItems; } 
}; 

class Deveried1 : public Base{ 
public: 
    Deveried1() :Base(5){} 
    } 
}; 

class Deveried2 : public Base{ 
public: 
    Deveried2() :Base(10){} 
    } 
}; 

class Deveried3 : public Base{ 
public: 
    Deveried3() :Base(10){} 
    } 
}; 

int main(){ 
    Base* foo = new Deveried3; 
} 
+0

因为多态只适用于方法,而不是变量。所以使用“numOfItem()”来代替const numOfItem – user2477 2014-12-13 11:49:28

+0

@ user2477我不认为我理解你的评论。你的代码是否允许任何这些代码不会? – nvoigt 2014-12-13 11:53:47

+0

您的代码是正确的(仅适用于我的示例代码)。我只是解释了为什么我使用numOfItem()而不是幻数(为了可读性而受益),numOfItem在许多地方使用,不仅在构造函数中。 – user2477 2014-12-13 11:58:18

2

事实上,你不能调用从派生类函数基类的构造函数,所以这种扭曲的依赖关系无法正常工作。我的价值传递给基类的构造函数:

Base(int numOfItems) : remainItems(nomOfItems) {} 
Derived1() : Base(5) {} 
Derived2() : Base(10) {}