C++ 在我定义其函数之前,编译器假定子类是虚拟的
下面是一个示例程序,演示了我在一个大程序中遇到的一个问题 基本上,我在C++ 在我定义其函数之前,编译器假定子类是虚拟的,c++,inheritance,virtual-functions,C++,Inheritance,Virtual Functions,下面是一个示例程序,演示了我在一个大程序中遇到的一个问题 基本上,我在.h文件中有父类和子类的声明。因为父类A是虚拟的,所以编译器假定子类B也是虚拟的,并且不允许我在.cpp文件中定义它的函数。错误显示: 候选项是:虚拟void B::print() 但我不希望它是虚拟的 示例.h文件: A类{ 公众: int x; A(); 虚拟空打印(); }; B类:公共A{ 公众: 无效打印(){}; }; example.cpp文件: #包括“example.h” #包括 使用名称空间std; A:
.h
文件中有父类和子类的声明。因为父类A
是虚拟的,所以编译器假定子类B
也是虚拟的,并且不允许我在.cpp
文件中定义它的函数。错误显示:
候选项是:虚拟void B::print()
但我不希望它是虚拟的
示例.h文件:
A类{
公众:
int x;
A();
虚拟空打印();
};
B类:公共A{
公众:
无效打印(){};
};
example.cpp文件:
#包括“example.h”
#包括
使用名称空间std;
A::A(){x=10;}
B::print(){cout一旦一个方法被显式标记为virtual
,它在派生类中始终是虚拟的,即使它在这些类中没有显式标记为virtual
。这是无法更改的
出现错误的原因是您有两个相互竞争且不兼容的B::print()
定义-一个在example.h
中内联,另一个在example.cpp
中。您需要从example.h
中删除内联定义:
B类:公共A类{
公众:
void print();//一旦一个方法被显式标记为virtual
,它在派生类中始终是虚拟的,即使它在这些类中没有显式标记为virtual
。没有办法更改它
出现错误的原因是您有两个相互竞争且不兼容的B::print()
定义-一个在example.h
中内联,另一个在example.cpp
中。您需要从example.h
中删除内联定义:
B类:公共A类{
公众:
作废打印();//int x;
是private
B
看不到它。即使我移除花括号并将x公开,问题仍然存在。我应该编辑问题中的问题,因为我忽略了它们。int x;
是private
B
看不到它。即使我移除花括号并将x公开,问题仍然存在e x public。我应该编辑问题中的返回类型,因为我忽略了它们。我认为我只需要在声明中写入返回类型,而不需要在定义中写入返回类型,这就是它不起作用的原因。大括号只是一个忽略。它现在起作用了,谢谢!@GeorgeT“我认为我只需要在声明中写入返回类型,而不需要在定义中写入返回类型”-不。声明和定义都必须具有匹配的返回类型、调用约定和参数类型。我认为我只需要在声明中写入返回类型,而不需要在定义中写入返回类型,这就是它不起作用的原因。大括号只是一个疏忽。它现在起作用了,谢谢!@GeorgeT“我认为我只需要在声明中编写返回类型,而不需要在定义中编写”-否。声明和定义都必须具有匹配的返回类型、调用约定和参数类型。