qq_41945416 2025-10-30 15:12 采纳率: 90.6%
浏览 2
已结题

关于mfc的有虚函数选项和类继承方式问题

在mfc编程中,
1.1为什么在对类添加用户自定义函数时候,会有虚函数这个复选框选项呢?或者说为什么要把自定义的函数声明为虚函数呢?是方便有朝一日别人可以继承类当中的这个函数,从而实现函数的重写吗?一个类成员函数能不能被重写的依据就看父类成员函数有没有被声明为虚函数吗?重写函数的这个过程就是多态了吗?
1.2 函数的重写和重载 可能同时发生吗?
1.3既然类的继承有公有继承,那会不会像成员变量一样,会有私有继承和保护继承的说法呢?如果真的有私有继承和保护继承,语法是什么呢?

  • 写回答

3条回答 默认 最新

  • 宝码香车 优质创作者: JavaScript技术领域 2025-10-30 15:20
    关注

    让【宝码香车】来帮您解答,本回答参考DeepSeek编写,并整理提供。

    如果答案让您满意,请采纳、点赞、关注,非常感谢!
    .
    每日一句正能量,让它带给您好心情:生活就像一杯白开水,你往里面加什么,它就是什么味道。
    .

    MFC中虚函数与类继承方式详解

    1.1 虚函数相关问题

    为什么要有虚函数选项?

    在MFC类向导中添加用户自定义函数时提供"虚函数"复选框,主要是为了支持面向对象的多态特性。

    class CMyBaseClass {
    public:
        virtual void MyCustomFunction(); // 声明为虚函数
    };
    
    
    class CMyDerivedClass : public CMyBaseClass {
    public:
        virtual void MyCustomFunction() override; // 可以重写基类的虚函数
    };
    

    为什么要把自定义函数声明为虚函数?

    将函数声明为虚函数的主要目的是:

    1. 支持多态:允许派生类重写基类的行为
    2. 实现动态绑定:在运行时根据对象的实际类型调用相应的函数
    3. 提供扩展性:方便后续的类继承和功能扩展

    函数重写的依据

    是的,一个类成员函数能否被重写的唯一依据就是父类中的该函数是否被声明为virtual(虚函数)。

    class Base {
    public:
        virtual void canOverride() {}    // 可以被重写
        void cannotOverride() {}         // 不能被重写
    };
    
    
    class Derived : public Base {
    public:
        virtual void canOverride() override {}  // 正确:重写虚函数
        // void cannotOverride() {}             // 错误:不是重写,而是隐藏
    };
    

    重写与多态的关系

    是的,函数重写是实现多态的关键机制。多态允许使用基类指针或引用来调用派生类的实现:

    CMyBaseClass* pObj = new CMyDerivedClass();
    pObj->MyCustomFunction(); // 调用的是CMyDerivedClass的实现
    

    1.2 函数重写和重载能否同时发生?

    可以,函数重写和重载是两个不同的概念,它们可以同时存在:

    class Base {
    public:
        virtual void display() { cout << "Base display" << endl; }
        virtual void display(int x) { cout << "Base display " << x << endl; } // 重载
    };
    
    
    class Derived : public Base {
    public:
        virtual void display() override { cout << "Derived display" << endl; } // 重写
        virtual void display(int x) override { cout << "Derived display " << x << endl; } // 重写+重载
        void display(string s) { cout << "Derived display " << s << endl; } // 新的重载
    };
    
    • 重载:同一作用域内,函数名相同但参数列表不同
    • 重写:派生类重新定义基类的虚函数

    1.3 类的继承方式

    继承方式分类

    C++支持三种继承方式:

    class Base {
    public:
        int publicVar;
    protected:
        int protectedVar;
    private:
        int privateVar;
    };
    
    
    // 公有继承
    class PublicDerived : public Base {
        // publicVar -> public
        // protectedVar -> protected  
        // privateVar -> 不可访问
    };
    
    
    // 保护继承  
    class ProtectedDerived : protected Base {
        // publicVar -> protected
        // protectedVar -> protected
        // privateVar -> 不可访问
    };
    
    
    // 私有继承
    class PrivateDerived : private Base {
        // publicVar -> private
        // protectedVar -> private
        // privateVar -> 不可访问
    };
    

    各种继承方式的特点

    继承方式基类public成员基类protected成员基类private成员
    publicpublicprotected不可访问
    protectedprotectedprotected不可访问
    privateprivateprivate不可访问

    在MFC中的实际应用

    在MFC编程中,通常使用公有继承:

    class CMyDialog : public CDialog {
        // 公有继承,可以访问CDialog的public和protected成员
    };
    
    
    class CMyWnd : protected CFrameWnd {
        // 保护继承,较少使用,主要用于实现继承而非接口继承
    };
    

    总结:在MFC开发中,最常用的是公有继承,因为它保持了基类的访问权限,符合"是一个"的关系。保护继承和私有继承主要用于特殊的实现需求。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 11月7日
  • 已采纳回答 10月30日
  • 创建了问题 10月30日