鱼C论坛

 找回密码
 立即注册
查看: 86|回复: 4

[已解决]c++关于父类与子类的互相调用问题

[复制链接]
发表于 2024-5-30 21:35:21 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 闪亮的马路 于 2024-5-30 21:39 编辑

现在有个问题,像这样的两个类
class father,
class son :public father

std::unique_ptr<father> test = std::make_unique<son>();

现在的问题是,如果一个函数只定义在了son中, 那test是否可以调用,怎么实现?
以下是代码,在线运行是不可以调用son类总fun的

#include <iostream>
#include <memory>

class father{
public:
    void fun() {
        std::cout << "fathcer" <<std::endl;
    }
};

class son : public father{
public:
    void fun() {
        std::cout << "son" <<std::endl;
    }
    void fun1() {
        std::cout << "son 1" << std::endl;
    }
};

int main(int argc, char** argv) {
    std::unique_ptr<father> test = std::make_unique<son>();
    test->fun();
}
最佳答案
2024-5-30 21:35:38
在C++中,父类和子类之间的方法调用是有限制的。如果一个函数只定义在子类中,父类的对象将无法直接调用该函数。

在你的示例代码中,`test`是一个指向`father`对象的智能指针,它无法直接调用子类`son`中定义的函数。

如果你想让`test`对象调用`son`中的函数,你可以选择两种方式:

1. 将`fun()`函数定义为虚函数,在父类和子类中都进行声明和实现,并使用`override`关键字覆盖父类中的实现。这样,调用父类指针或引用指向的子类对象时,会调用子类中的函数。
#include <iostream>

class father {
public:
    virtual void fun() {
        std::cout << "Father's fun()" << std::endl;
    }
};

class son : public father {
public:
    void fun() override {
        std::cout << "Son's fun()" << std::endl;
    }
};

int main() {
    std::unique_ptr<father> test = std::make_unique<son>();
    test->fun(); // 调用的是子类的fun()函数
    return 0;
}

2. 将`fun()`函数定义为静态成员函数,并通过类名来调用。这种方式可以在不创建对象的情况下直接调用函数。
#include <iostream>

class father {
public:
    static void fun() {
        std::cout << "Father's fun()" << std::endl;
    }
};

class son : public father {
public:
    static void fun() {
        std::cout << "Son's fun()" << std::endl;
    }
};

int main() {
    son::fun(); // 直接调用子类的fun()函数
    return 0;
}

希望能够解答你的问题!如有疑问,请随时追问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-5-30 21:35:38 | 显示全部楼层    本楼为最佳答案   
在C++中,父类和子类之间的方法调用是有限制的。如果一个函数只定义在子类中,父类的对象将无法直接调用该函数。

在你的示例代码中,`test`是一个指向`father`对象的智能指针,它无法直接调用子类`son`中定义的函数。

如果你想让`test`对象调用`son`中的函数,你可以选择两种方式:

1. 将`fun()`函数定义为虚函数,在父类和子类中都进行声明和实现,并使用`override`关键字覆盖父类中的实现。这样,调用父类指针或引用指向的子类对象时,会调用子类中的函数。
#include <iostream>

class father {
public:
    virtual void fun() {
        std::cout << "Father's fun()" << std::endl;
    }
};

class son : public father {
public:
    void fun() override {
        std::cout << "Son's fun()" << std::endl;
    }
};

int main() {
    std::unique_ptr<father> test = std::make_unique<son>();
    test->fun(); // 调用的是子类的fun()函数
    return 0;
}

2. 将`fun()`函数定义为静态成员函数,并通过类名来调用。这种方式可以在不创建对象的情况下直接调用函数。
#include <iostream>

class father {
public:
    static void fun() {
        std::cout << "Father's fun()" << std::endl;
    }
};

class son : public father {
public:
    static void fun() {
        std::cout << "Son's fun()" << std::endl;
    }
};

int main() {
    son::fun(); // 直接调用子类的fun()函数
    return 0;
}

希望能够解答你的问题!如有疑问,请随时追问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-5-30 22:16:10 | 显示全部楼层
虚函数
sh-5.2$ cat main.cpp
#include <iostream>
#include <memory>

class father{
public:
    virtual void fun() {
        std::cout << "fathcer" <<std::endl;
    }
};

class son : public father{
public:
    virtual void fun() {
        std::cout << "son" <<std::endl;
    }
    void fun1() {
        std::cout << "son 1" << std::endl;
    }
};

int main(int argc, char** argv) {
    std::unique_ptr<father> test = std::make_unique<son>();
    test->fun();
}
sh-5.2$ ./main
son
sh-5.2$
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-5-31 09:16:38 | 显示全部楼层
FishC 发表于 2024-5-30 21:35
在C++中,父类和子类之间的方法调用是有限制的。如果一个函数只定义在子类中,父类的对象将无法直接调用该 ...

第一种方法的override是必须的吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-5-31 09:16:56 | 显示全部楼层
闪亮的马路 发表于 2024-05-31 09:16
第一种方法的override是必须的吗?


是的,`override`关键字是可选的,但它可以提高代码的可读性和可维护性。

在C++11标准之前,如果你在子类中重写了父类的虚函数,并且没有使用`override`关键字进行显式声明,那么如果你错误地拼写了函数名或者函数参数列表不匹配,编译器将无法给出警告或错误提示。这可能导致难以发现的bug。

使用`override`关键字可以明确表示你是想要重写基类的虚函数,并且编译器会在函数签名不匹配的情况下报错。

所以,尽量在子类中重写虚函数时使用`override`关键字,这样能够提供更好的代码质量和可读性。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-26 11:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表