Код: Выделить всё
class BaseClass:
# ... base class methods ... #
class Subclass1(BaseClass):
myattr = 1
class Subclass2(BaseClass):
myattr = 2
# ...
mylist = [Subclass1(), Subclass2()]
# ...
foo(mylist[0].myattr) # works fine!
< /code>
Но C ++ более конкретно в печати и еще много чего. Желаемый результат заключается в том, что у меня может быть массив указателей BaseClass Код: Выделить всё
class BaseClass {
public:
// ...
};
class Subclass: public BaseClass {
public:
myattr = 1;
};
// ...
BaseClass** ptrs = new BaseClass*[20];
// ...
foo(ptrs[1]->myattr); // throws an error at compile time because "myattr"
// is not an attribute of BaseClass, which is what
// is expected from the array after dereference
Код: Выделить всё
BaseClassУ меня были идеи о том, как добиться такого поведения: а) переопределение метода в базе класс, который возвращает константу, и б) настройку атрибута в базовом классе с помощью инициализатора. Они выглядят так:
Код: Выделить всё
// Case A: overriding a method
class BaseClass {
public:
// ...
virtual int myattr() { throw std::runtime_error("Use a Subclass!"); }
};
class Subclass: public BaseClass {
public:
// ...
int myattr() override { return 1; }
};
Код: Выделить всё
// Case B: setting an attribute in the base class and using an initializer
class BaseClass {
public:
int myattr;
BaseClass(int value) { myattr = value; }
// ...
};
class Subclass {
public:
Subclass(): BaseClass(1) {}
// ...
};
Подробнее здесь: https://stackoverflow.com/questions/793 ... c-subclass
Мобильная версия