c++ - C++不支持非成员虚函数的原因是什么
问题描述
我很想知道 C++ 中没有非成员虚函数的原因是什么。特别是考虑到它只是在您想要实现它时增加了代码层,因为您可以定义一个虚拟成员函数,然后从非成员函数调用它。
编辑:仅供参考,您可以这样做:
struct Base
{
virtual void say() const
{
std::cout << "Base\n";
}
};
struct Derived : public Base
{
void say() const final
{
std::cout << "Derived\n";
}
};
void say(Base* obj)
{
obj->say();
}
say(static_cast<Base*>(new Derived()));
编辑2:确实存在您需要虚拟多态性的情况,因为您可能会遇到以下情况,它不能以类似的方式工作,因为它会打印 Base 而如果您要使用上述代码调用它,则类似时尚它将打印派生。我相信这总结了问题的症结所在。
void say(Base* obj)
{
std::cout << "Base\n";
}
void say(Derived* obj)
{
std::cout << "Derived\n";
}
say(static_cast<Base*>(new Derived()));
解决方案
非成员函数不需要隐式this
指针来调用它。
但是虚函数需要一个this
指针(即对象实例)才能使多态起作用。
还有一个矛盾:所以不可能有一个多态的非成员函数。
推荐阅读
- powershell - 显示验证码供用户在 powershell 中解析
- spring-security - Spring 安全 5.20 + SAML2
- c++ - C++ 概念不好用?
- ios - 在一个会话中运行具有不同参数的 UITest
- javascript - 在 Dynamics 365 中,是否可以根据记录的字段值和用户权限筛选关联的视图结果?
- node.js - 如何在 nodejs 服务器上拥有多个节点应用程序?
- mongodb - MongoDB基于共享键聚合多个对象数组
- pyspark - 基于 PySpark 中另一个数据帧的值,使用 ArrayType 映射列的值
- javascript - 不能使用点符号或括号符号进入数组
- linux - Kafka 将 Docker 用于生产集群