0

假设我们有一个基类 Country,它以国家字母作为变量。每个派生类都应该有自己的国家字母。我试过这个,但它显然不起作用:

class Country
{
protected:
    char letter;
    virtual void set_letter(){}
public:
    Country()
    {
        set_letter();
    }
};

class England : public Country
{
    void set_letter()
    {
        letter = 'e';
    }
};

我的想法是派生类将继承基类的构造函数,该构造函数将调用“set_letter()”方法,每个类都不同。但现在我知道这是不可能的,因为构造函数将从基类而不是派生类调用方法。

另一种选择是写“字母='e';” 在每个构造函数定义体中。但是如果一个类有很多构造函数呢?我每次都得写。

我希望你明白我在说什么。什么是最好的解决方案?也许是这样:

class Country
{
protected:
    virtual char letter() const = 0;
    .
    .
    .
};

class England : public Country
{
    static const char let = 'e';
    char letter() const
    {
        return let;
    }
    .
    .
    .
};

是的,它有效。但我想知道有没有一种方法可以做到这一点,而无需将“字母”作为一种方法。不要问为什么...谢谢

4

2 回答 2

1

您可以尝试另一种解决方案:使用模板

template<char LETTER>
class Country
{
private:
    static const char letter = LETTER;

public:
    char get_letter() const { return letter; }
};


class England : public Country<'e'> { ... };
class Spain   : public Country<'s'> { ... };
class France  : public Country<'f'> { ... };
/* etc */
于 2013-09-21T23:06:38.380 回答
1

另一种方法是去掉字母成员并使用(虚拟)get 方法获取国家代码。使用这种方法,您可以仅使用 get 方法获取国家代码。这具有为每个实例节省(少量)内存的额外好处,以及具有虚拟方法调用的缺点。另一个变体是将基类中的 get 方法声明为纯虚拟 - 因此强制在派生类中实现它,同时禁止基类的实例化。

class Country
{
protected:
public:
    Country() {};
    // you may alternatively use "virtual char get_letter() = 0;" instead - 
    //     forcing you to implement get_letter() in every derived class, 
    //     while preventing direct use of the base class.
    virtual char get_letter()
    { 
         return((char)0); // 0 being code for generic Country instance
    }
 }

class England : public Country
{
    char get_letter()
    {
        return('e');
    }
};
于 2013-09-22T16:26:41.593 回答