从父类调用子类的重写方法

四位

我想通过编写具有可互换系统的简单手机应用程序来练习 C++。我创建了一个 System 基类,还创建了扩展 System 类的 MyOS 类。在 Phone 类中,我有一个 System 类的变量,因为我认为就像在 Java 中一样,您可以将它分配给子类。(例如,系统 sys = new MyOS();)。但在 C++ 中,它调用基类中的函数。

我想在 C++ 中工作,但它在 Java 中。

public class MyParent {
    public void start() {
        System.out.println("start() executed in MyParent");
    }
}

public class MyChild extends MyParent {
    @Override
    public void start() {
        System.out.println("start() excecuted in MyChild");
    }
}

public class Inherit {
    MyParent parent;
    
    public Inherit(MyParent parent) {
        this.parent = parent;
    }
    
    public void start() {
        parent.start();
    }
}

public class TestInherit {
    public static void main(String[] args) {
        Inherit i = new Inherit(new MyChild());
        i.start();
    }
}

Output: start() excecuted in MyChild

我当前的 C++ 代码:

系统.h

#pragma once

#include <iostream>

class System {
public:

    void start() {
        std::cout << "Booting System..." << std::endl;
    }
};

操作系统.h

#pragma once

#include <iostream>
#include "System.h"

class MyOS: public System {
public:

    // Override
    void start() {
        std::cout << "Booting MyOS..." << std::endl;
    }
};

电话.h

#pragma once

#include "System.h"

class Phone {
public:

    Phone(System system) {
        Phone::system = system;
    }

    void start() {
        system.start();
    }

private:

    System system;
};

我的手机.cpp

#include "MyOS.h"
#include "Phone.h"
#include "System.h"

int main() {
    MyOS os;
    Phone myPhone(os);
    myPhone.start();

    return 0;
}

Output: Booting System...
克里斯·多德

如果您来自 java,则需要记住 java 中的每个类引用都是隐式指针,因此要制作等效的 C++ 代码,您需要将所有类间引用变成指针。

此外,java 中的每个方法都是隐式虚拟的,因此如果要覆盖它们,则需要virtualC++ 中的显式方法。

所以你最终会得到类似的东西:

#include <iostream>

class System {
public:

    virtual void start() {
        std::cout << "Booting System..." << std::endl;
    }
};

class MyOS: public System {
public:

    // Override
    void start() override {
        std::cout << "Booting MyOS..." << std::endl;
    }
};

class Phone {
public:

    Phone(System *system) {
        this->system = system;
    }

    void start() {
        system->start();
    }

private:

    System *system;
};

int main() {
    MyOS os;
    Phone myPhone(&os);
    myPhone.start();

    return 0;
}

当然,使用原始指针会导致内存泄漏和损坏,因为 C++ 没有内置垃圾收集。因此,您通常希望改用“智能”指针——要么std::unique_ptrstd::shared_ptr

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章