Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+中多重继承菱形问题中的函数重载+;_C++_Multiple Inheritance_Diamond Problem - Fatal编程技术网

C++ C+中多重继承菱形问题中的函数重载+;

C++ C+中多重继承菱形问题中的函数重载+;,c++,multiple-inheritance,diamond-problem,C++,Multiple Inheritance,Diamond Problem,这只是一个关于多重继承中菱形问题中函数重载应遵循的最佳实践的问题 #include <iostream> using namespace std; class A { public: virtual void print() { cout << "In A" << endl; } }; class B : public virtual A { public: virtual void print()

这只是一个关于多重继承中菱形问题中函数重载应遵循的最佳实践的问题

#include <iostream>

using namespace std;

class A {
    public:
    virtual void print() {
        cout << "In A" << endl;
    }
};

class B : public virtual A {
    public:
    virtual void print() {
        A::print();
        cout << "In B" << endl;
    }
};

class C : public virtual A {
    public:
    virtual void print() {
        A::print();
        cout << "In C" << endl;
    }
};

class D : public virtual B, public virtual C {
    public:
    virtual void print() {
        B::print();
        C::print();
        cout << "In D" << endl;
    }
};
a.print()

输出:

In A
In A
In B
In A
In C
b.print()

输出:

In A
In A
In B
In A
In C
c.print()

输出:

In A
In A
In B
In A
In C
D类
源自
B类
C类

class D
还需要重载
print()
函数,并调用其父类
class B
class C
以及祖辈类
class A
的所有打印函数

使用
B::print();C::print()类D的重载
print()
函数中的code>:

d.print()

输出:

In A
In B
In A
In C
In D
In A
In B
In C
In D
这是预期的,因为
类B
类C
中重载的
print()
函数都调用了
A::print()

类D
中重载
print()
函数的最佳做法是什么

d.print()

输出:

In A
In B
In A
In C
In D
In A
In B
In C
In D

如果类
class A
class B
class C
不能修改。

如果不能修改A、B、C类,并且B和C都调用A,那么就无法通过对继承的任何更改来实现A、B、C、D的输出。即使您没有从B和C继承,只是插入B和C并对它们调用print,您仍然会得到一个重复的。如果允许修改类A、B和C,解决方案会是什么?Re:“派生类中重载的函数”-函数没有重载,它被重写。当同一作用域中有同一函数的两个声明时,就会发生重载。当派生类的某个基类中的某个函数的名称和签名与某个函数的名称和签名相同时,就会发生重写。由于不能修改a、B、C类,并且B和C都调用a,因此无法通过对继承的任何更改来实现a、B、C、D的输出。即使您没有从B和C继承,只是插入B和C并对它们调用print,您仍然会得到一个重复的。如果允许修改类A、B和C,解决方案会是什么?Re:“派生类中重载的函数”-函数没有重载,它被重写。当同一作用域中有同一函数的两个声明时,就会发生重载。当派生类的某个函数与其基类中的某个函数具有相同的名称和签名时,就会发生重写。