Следующий код имеет 4 класса: Base1, Derived1 (производный от Base1), Base2, Derived2 (производный от Base2). Оба базовых класса имеют целочисленные функции data1 и display_data(). Оба производных класса имеют целые числа data1 и data2, а также функции display_data().
Я попробовал 4 случая в своем коде, которые можно увидеть в основной функции. Я не могу понять, какой из них является случаем статической привязки, а какой динамическим. Мне нужна помощь здесь. Я также хотел бы знать, какой из этих случаев можно считать переопределением функции.
КОД:
#include <iostream>
using namespace std;
class Base1{
protected:
int data1;
public:
Base1(int idata1 = 0) {
data1 = idata1;
}
void display_data() {
cout << "Base1: " << data1 << endl;
}
};
class Derived1 : public Base1 {
protected:
int data2;
public:
Derived1(int idata1 = 0, int idata2 = 0) {
data1 = idata1;
data2 = idata2;
}
void display_data() {
cout << "Derived1: " << data1 << ' ' << data2 << endl;
}
};
class Base2 {
protected:
int data1;
public:
Base2(int idata1 = 0) {
data1 = idata1;
}
virtual void display_data() {
cout << "Base2: " << data1 << endl;
}
};
class Derived2 : public Base2 {
protected:
int data2;
public:
Derived2(int idata1 = 0, int idata2 = 0) {
data1 = idata1;
data2 = idata2;
}
void display_data() {
cout << "Derived2: " << data1 << ' ' << data2 << endl;
}
};
int main()
{
// case 1
Derived1 d1(1, 10);
d1.display_data();
// case 2
Base1* d2 = new Derived1(2, 20);
d2->display_data();
// case 3
Derived2 d3(3, 30);
d3.display_data();
// case 4
Base2* d4 = new Derived2(4, 40);
d4->display_data();
return 0;
}
ВЫВОД:
Derived1: 1 10
Base1: 2
Derived2: 3 30
Derived2: 4 40
virtual
, используемая версия определяется во время компиляции на основе типа объекта, вызывающего функцию, поэтому в случае 2 вы видите, что вызываетсяBase1::display_data
, потому что он вызывается из указателяBase1*
. Когда используется функцияvirtual
, используемая версия определяется во время выполнения на основе фактического наиболее производного типа объекта, который вы можете видеть в случае 4. - person Nathan Pierson   schedule 23.03.2021