C++ 否';void TestSub::print()';在类'中声明的成员函数;TestSub&x27;

C++ 否';void TestSub::print()';在类'中声明的成员函数;TestSub&x27;,c++,C++,父类 class Test { public: Test(){}; virtual ~Test(){}; void print() { cout<<1<<endl;}; }; 子类.cpp实现 #include "TestSub.h" TestSub::TestSub() { } TestSub::~TestSub() { } void TestSub::print(){ cout<<2<<endl; }

父类

class Test {
public:
    Test(){};
    virtual ~Test(){};
    void print() {  cout<<1<<endl;};
};
子类.cpp实现

#include "TestSub.h"

TestSub::TestSub() {

}

TestSub::~TestSub() {
}

void TestSub::print(){
    cout<<2<<endl;
}

int main(){
    TestSub *t=new TestSub();
    t->print();
}
#包括“TestSub.h”
TestSub::TestSub(){
}
TestSub::~TestSub(){
}
void TestSub::print(){

cout如果不指定返回类型C,则函数的返回类型默认为int。这与类中声明的void返回类型不匹配。

您有两个错误:

  • 首先,您必须将您在
    TestSub
    中的函数声明为:
    void print();

  • 第二,您必须为您的实现指定返回类型,C++不接受默认返回类型,如<代码> C>代码>,因此必须将实现转换为ValuestTestSub::PrdTr..({…} /代码>

    )。
print()函数未在TestSub类中声明

class TestSub: public Test {
public:
    TestSub();
    void print();        // add declaration.
    virtual ~TestSub();
 };
我猜你也打算把
Test::print
虚拟化

class Test {
public:
    Test(){}
    virtual ~Test(){}
    virtual void print() {  std::cout << 1 << std::endl;} 
};
类测试{
公众:
Test(){}
虚拟~Test(){}

virtual void print(){std::难道你忘了类型..改为执行
void TestSub::print()
。我按照你提到的做了,但是没有弹出“void TestSub::print()”我不明白TestSub为什么要声明void print(),它是从具有print方法的test扩展而来的。感谢您的解释,您是对的,它是从
test
派生而来的,但是编译器应该如何知道您想要更改基类的实现,除非您在类中这样说?Testsub扩展测试,所以它必须具有print方法,为什么还需要声明它?因为您尝试了反编译再次调整它
void TestSub::print()
。如果要测试::print以打印
1
和TestSub::print以打印2,则需要将Test::print设置为虚拟并在TestSub中重写。这最终会导致函数多态性
class Test {
public:
    Test(){}
    virtual ~Test(){}
    virtual void print() {  std::cout << 1 << std::endl;} 
};