我有一個包含大量資料的類。根據情況,我需要以不同的方式輸出這些資料。我希望將每種情況的輸出例程分開,并且我希望保持基類干凈。
強制轉換為不添加任何資料成員而僅添加非虛擬函式的派生類是否絕對安全?
#include <stdio.h>
class Base {
public:
Base() { printf("Base()\n"); }
double A = 3.14;
int B = 5;
int C = 42;
};
class Derived1 : public Base {
public:
Derived1() { printf("Derived1()\n"); }
void DoStuff() {
// doing stuff with base class's data
printf(" A = %.4f\n", A);
printf(" B = %d\n", B);
printf(" C = %d\n", C);
}
};
class Derived2 : public Base {
public:
Derived2() { printf("Derived2()\n"); }
void DoStuff() {
// doing stuff with base class's data in a slightly different way
printf(" A = %.4f, B = %d, C = %d\n", A, B, C);
}
};
class OtherBase {
public:
OtherBase() { printf("OtherBase()\n"); }
int D = 10;
};
class Derived3 : virtual public OtherBase, virtual public Base {
public:
Derived3() { printf("Derived3()\n"); }
void SomeFunction() {
A = 6.28;
B = 1;
C = 500;
printf("Done some other stuff.\n");
}
};
int main() {
printf("Base class\n\n");
Base* Instance = new Base();
printf("Cast to Derived1:\n");
static_cast<Derived1*>(Instance)->DoStuff();
printf("Cast to Derived2:\n");
static_cast<Derived2*>(Instance)->DoStuff();
printf("\nOther class derived from base class\n\n");
Derived3* Instance2 = new Derived3();
Instance2->SomeFunction();
printf("Cast to Derived1:\n");
static_cast<Derived1*>(static_cast<Base*>(Instance2))->DoStuff();
printf("Cast to Derived2:\n");
static_cast<Derived2*>(static_cast<Base*>(Instance2))->DoStuff();
printf("c-style cast to Derived1:\n");
((Derived1*) Instance2)->DoStuff();
printf("c-style cast to Derived2:\n");
((Derived2*) Instance2)->DoStuff();
return 0;
}
類“Derived3”(具有“Base”的虛擬繼承)首先轉換為“Base”然后轉換為“Derived1”/“Derived2”的部分對我來說看起來不太好,但我知道c風格的轉換是如何進行的在 C 社區中不受歡迎。然而,在這個小例子中,c 風格的轉換編譯和作業得很好:
我知道存在多重繼承的問題,其中一個基類的轉換可以具有與它被轉換的繼承類不同的指標地址。所以我明白依賴它可能太危險了。
我在示例中所做的靜態轉換是安全的嗎?
uj5u.com熱心網友回復:
不,這不安全。程式的行為是未定義的。
僅當物件的動態型別是派生型別(或進一步派生型別)時,靜態轉換為派生型別才是安全的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/345012.html
