Bruce Eckel のコード、C++ で考える
class A {
int i;
public:
A(int ii) : i(ii) {}
~A() {}
void f() const {}
};
class B {
int i;
public:
B(int ii) : i(ii) {}
~B() {
void f() const {}
};
class C : public B {
A a;
public:
C(int ii) : B(ii), a(ii) {}
~C() {} // Calls ~A() and ~B()
void f() const { // Redefinition
a.f();
B::f();
}
};
int main() {
C c(47);
}
このコードについて、彼は次のように述べています。
関数 C::f( ) は、継承した B::f( ) を再定義し、基底クラス バージョンも呼び出します。さらに、af( ) を呼び出します。関数の再定義について話すことができるのは継承の間だけであることに注意してください。メンバー オブジェクトを使用すると、オブジェクトのパブリック インターフェイスのみを操作でき、再定義することはできません。
彼はどういう意味ですか?
この関数は、スコープ解決演算子を介してC::f()
呼び出しているだけです。これは継承されており、 にも同名の関数が存在するためです。 の関数は、クラスで定義されたオブジェクトを通じて呼び出されます。f()
B
C
A
f()
C
f()
では、エッケルが言う関数の再定義はどこにあるのでしょうか?