У меня есть этот простой код:
class A {
public:
string toString() const { return "A"; }
};
class B : public A {
public:
string toString() const { // some code here }
};
я хочу toString()
в классе B будет наследовать от класса A и принимать некоторые дополнительные значения. В этом примере будет: «AB» (A: из класса A и B: дополнительная строка).
Это легко в Java, но я не знаю, как это сделать в C ++. Моя первая идея — взять строку из toString()
в классе А и добавить дополнительную строку. Итак, чтобы взять это: я использую: static_cast<A>(const_cast(this))->toString()
но это не сработает 🙁
Пожалуйста, помогите мне. Спасибо 🙂
class A {
public:
string toString() const { return "A"; }
};
class B : public A {
public:
string toString() const { return A::toString() + "B"; }
};
В реализации MS (в Windows) вместо этого вы можете использовать __super :: toString (), но это непереносимое расширение MS.
string B::toString() const {
string result = A::toString(); // calls the member method in A
// on the current object
result += "B";
return result;
}
Квалификация вызова функции определяет, какая функция переопределения (если функция полиморфная) будет вызвана, поэтому она гарантирует, что динамическая диспетчеризация не будет отправлена в B::toString()
снова. Основное отличие от Java состоит в том, что, поскольку C ++ допускает множественное наследование, вы должны назвать основание A::
а не просто звонить super
,
Прежде всего вы, вероятно, хотите, чтобы toString был виртуальным. Во-вторых, чтобы выполнить то, что вы хотите, вы можете сделать что-то вроде этого в B :: toString:
class B : public A
{
...
virtual string toString() const
{
string s = A::toString();
s += "B";
return s;
}
...