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“我认为我只需要在声明中编写返回类型,而不需要在定义中编写”-否。声明和定义都必须具有匹配的返回类型、调用约定和参数类型。