Полиморфные статические переменные-члены const в ABC? - PullRequest
3 голосов
/ 26 сентября 2011

У меня довольно странная ситуация, когда я хотел бы иметь возможность определять определенные константы, которые может переопределять подкласс ABC.

struct A {
    static const int a = 20;
    virtual int func() = 0;
};
struct B : public A {
    static const int a = 3;
    int func() { return 5; }
};
struct C : public A {
    static const int a = 4;
    int func() { return 3; }
};

К сожалению, если я использую A *aPtr = new B, aPtr->aвернет 20 вместо 3.

Один обходной путь, который я вижу, - это однострочные функции (по линиям func в приведенном выше примере), но синтаксис констант для этого немного более подходитособенно ситуация концептуально.Существует ли синтаксически разумный способ определения того, какие константы использовать во время выполнения, когда вызывающему коду не нужно ничего знать после первоначального создания объекта?

Ответы [ 2 ]

8 голосов
/ 26 сентября 2011

Константы, особенно статические, нельзя переопределять, как вы просите. Вместо этого вам придется использовать виртуальную функцию:

struct A {
    virtual int get_a() { return 20; }
    int func() = 0;
};

struct B : public A {
    virtual int get_a() { return 3; }
    int func() { return 5; }
};

struct C : public A {
    virtual int get_a() { return 4; }
    int func() { return 3; }
};

Другой вариант - вместо шаблона использовать шаблон:

template< const int a_value = 20 >
struct A {
    static const int a = a_value;
    int func() = 0;
};

struct B : public A<3> {
    int func() { return 5; }
};

struct C : public A<4> {
    int func() { return 3; }
};
1 голос
/ 26 сентября 2011

Вы можете получить ответ из самого примера! :) Просто объявите метод типа get_a(), который равен virtual, и переопределите его.

struct A {
    static const int a = 20;
    virtual int get_a() const { return a; }  // <--- for A
};
struct B : public A {
    static const int a = 3;
    virtual int get_a() const { return a; }    // <--- for B
};
struct C : public A {
    static const int a = 4;
    virtual int get_a() const { return a; }    // <--- for C
};

Также обратите внимание, что в C ++ может быть переопределен только метод, а не переменные.

...