动态调度OOP

bal*_*boa 3 c++ oop

我在cpp中编写代码来测试我对动态调度的理解.我认为在我的程序中输出应该是" 我在NT ".我的理由是:

  1. tMethod被定义为虚拟,因此将使用动态绑定
  2. 在运行时类的类型test是NT,所以调用test->tMethod(ont)应该在NT内部寻找实现
  3. 实际参数ont是NT类型,因此发现完全匹配是NT对tMethod的强制执行

但是,这个程序的输出是" 我在T ".

我的推理有什么问题?

 #include <iostream>

    using namespace std;

    class T {

        public:
            virtual void tMethod(T){
                cout<<"I'm in T"<<endl;
            }

    };

    class NT: public T{
        public:
            void tMethod(NT){
                cout<<"I'm in NT"<<endl;
            }

    };


    int main()
    {
        NT ont;

        T* test=new NT();

        test->tMethod(ont);

        return 0;
    }
Run Code Online (Sandbox Code Playgroud)

mar*_*inj 5

这个方法:

void tMethod(NT){
Run Code Online (Sandbox Code Playgroud)

不会覆盖这一个:

virtual void tMethod(T){
Run Code Online (Sandbox Code Playgroud)

您已将参数类型从更改NTT

您可以添加覆盖以将此错误转换为错误:

void tMethod(NT) override {
Run Code Online (Sandbox Code Playgroud)

将输出:

main.cpp:16:18:错误:'void NT :: tMethod(NT)'标记为'覆盖',但不覆盖void tMethod(NT)覆盖{

[编辑]

您的实际问题是为什么C++不允许跨类继承重载函数,特别是能够使用基类指针访问派生类函数.原因是语言不支持此功能.您可以在Bjarne Stroustrup FAQ中找到类似的问题:为什么不对重载类进行重载?