我可以补充子类的虚函数吗?
Am I able to complement a virtual function of subclasses?
我有一个问题。假设我在 main class:
中有这个虚函数
virtual void h_w() { cout << "Hello, wolrd!" << endl; }
我正在执行与以下相同的功能:
void h_w() { cout << "Today is: " << math.rand(); << endl; }
我可以这样做吗?我的意思是,我可以像在 subclasses 中那样改变 main 函数的主体吗?谢谢
假设你的意思是你想要这样的东西:
class base {
public:
virtual void h_w() { std::cout << "Hello world!\n"; }
};
class derived : public base {
public:
void h_w() { std::cout << "Today is: " << rand() << "\n"; }
};
int main() {
std::unique_ptr<base> b = std::make_unique<derived>();
b->h_w();
}
...那么是的,C++ 支持它。事实上,这几乎是虚函数的规范演示,至少如果您将名称更改为(例如)"animal" 作为基础 class 和 "duck" 作为派生 class,并让他们分别打印出类似 "generic animal" 和 "duck" 的内容。作为记录,可能值得注意的是,大多数基于动物的示例或多或少以各种方式被破坏,例如动物根本没有像我们期望的代码那样遵循简单的规则集。
一个更好的例子,类似于定义数据库通用接口的基础 class,允许读取记录、写入记录和查找满足某些条件的记录集等操作。然后,派生的 class 可以(例如)提供一个实现来根据某些特定类型的数据库执行那些 "commands"——可能是 SQL,或者可能是一些简单的 key/value 存储引擎,但客户端不知道或不关心,除了性能等次要细节。
至于为什么这样更好:首先,因为它更接近于您可能真正使用计算机所做的事情。其次,因为我们可以定义数据库来真正遵守我们的规则并履行我们设定的义务。对于动物,对于我们可能尝试制定的任何有意义的规则,我们都会遇到各种例外情况,以及一个简单的事实,即(当然)能够让 Duck
说 "quack" 和一只狗说 "bow wow" 并不是很有用(在极少数情况下它很有用,我们可能只是想 save/retrieve 它听起来像某种 blob,而不是定义一个全新的类型来编码更好地存储为数据的东西)。
我有一个问题。假设我在 main class:
中有这个虚函数virtual void h_w() { cout << "Hello, wolrd!" << endl; }
我正在执行与以下相同的功能:
void h_w() { cout << "Today is: " << math.rand(); << endl; }
我可以这样做吗?我的意思是,我可以像在 subclasses 中那样改变 main 函数的主体吗?谢谢
假设你的意思是你想要这样的东西:
class base {
public:
virtual void h_w() { std::cout << "Hello world!\n"; }
};
class derived : public base {
public:
void h_w() { std::cout << "Today is: " << rand() << "\n"; }
};
int main() {
std::unique_ptr<base> b = std::make_unique<derived>();
b->h_w();
}
...那么是的,C++ 支持它。事实上,这几乎是虚函数的规范演示,至少如果您将名称更改为(例如)"animal" 作为基础 class 和 "duck" 作为派生 class,并让他们分别打印出类似 "generic animal" 和 "duck" 的内容。作为记录,可能值得注意的是,大多数基于动物的示例或多或少以各种方式被破坏,例如动物根本没有像我们期望的代码那样遵循简单的规则集。
一个更好的例子,类似于定义数据库通用接口的基础 class,允许读取记录、写入记录和查找满足某些条件的记录集等操作。然后,派生的 class 可以(例如)提供一个实现来根据某些特定类型的数据库执行那些 "commands"——可能是 SQL,或者可能是一些简单的 key/value 存储引擎,但客户端不知道或不关心,除了性能等次要细节。
至于为什么这样更好:首先,因为它更接近于您可能真正使用计算机所做的事情。其次,因为我们可以定义数据库来真正遵守我们的规则并履行我们设定的义务。对于动物,对于我们可能尝试制定的任何有意义的规则,我们都会遇到各种例外情况,以及一个简单的事实,即(当然)能够让 Duck
说 "quack" 和一只狗说 "bow wow" 并不是很有用(在极少数情况下它很有用,我们可能只是想 save/retrieve 它听起来像某种 blob,而不是定义一个全新的类型来编码更好地存储为数据的东西)。