gpt4 book ai didi

c++ - C++中带继承的函数重定义的实际意义

转载 作者:搜寻专家 更新时间:2023-10-31 01:48:49 25 4
gpt4 key购买 nike

来自 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);
}

对于他说的这个代码,

The function C::f( ) redefines B::f( ), which it inherits, and also calls the base-class version. In addition, it calls a.f( ). Notice that the only time you can talk about redefinition of functions is during inheritance; with a member object you can only manipulate the public interface of the object, not redefine it.

他是什么意思?

C::f() 函数只是通过作用域解析运算符调用Bf()。这是因为它是继承的,并且 C 中也存在同名函数。 A 的函数f() 是通过类C 中定义的对象调用的。

那么,Eckel 所说的函数 f() 的重定义在哪里呢?

最佳答案

由于类 C 派生自 B,函数 C::f() 覆盖了函数 B::f() 通过定义自己的版本。如果声明一个C类型的对象并调用它的f()函数,它将执行C::f(),这可以完全独立于 B::f()。所以重定义了基类函数。

注意 C 类还包含一个 A 类型的成员,它也有一个函数 f(),并且 Cf() 实现恰好调用了 a.f()。所以 C 可以为它自己的 f() 提供一个不同的接口(interface),但是它不能改变 A 的实现。

关于c++ - C++中带继承的函数重定义的实际意义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17253466/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com