我有一個基類和許多派生類,按以下方式定義:
class BaseClass {
public:
virtual ClassType getClassType() {return classType;}
private:
ClassType classType = BaseType;
}
class DerivedClass: public BaseClass {
public:
ClassType getClassType() override {return classType;}
private:
ClassType classType = DerivedType;
}
同一個基類有許多相似的派生類,它們共享相似的結構。
我有一個不斷生成BaseClass物件的生成器,每次我都會呼叫x.getClassType()知道它的型別別,然后使用dynamic_cast它來將其強制轉換為相應的派生類。
問題是,我必須getClassType()在每個派生類中一遍又一遍地撰寫相同的函式。
無論如何只寫一次函式,每個類都會classType在從 a 呼叫時回傳它們對應的值BaseClass*?
uj5u.com熱心網友回復:
我會呼叫
x.getClassType()知道它的型別別,然后用dynamic_cast它來將它強制轉換為相應的派生類。
如果您知道物件的型別是什么,則可以使用static_cast代替dynamic_cast。另一方面,如果使用dynamic_cast,則可以完全擺脫getClassType(),因為您可以只查詢物件是否與給定型別匹配。
無論如何只寫一次函式,每個類都會
classType在從 a 呼叫時回傳它們對應的值BaseClass*?
您只需要一個classType成員,在 中BaseClass,您不需要為每個班級重復該成員。因此,您可以從 中洗掉virtual,getClassType()然后提供BaseClass建構式引數來分配classType成員。這樣,DerivedClass然后可以將其型別傳遞給BaseClass建構式,例如:
class BaseClass {
public:
BaseClass(ClassType classType = BaseType) : classType(classType) {}
ClassType getClassType() { return classType; }
private:
ClassType classType;
};
class DerivedClass : public BaseClass {
public:
DerivedClass() : BaseClass(DerivedType) {}
};
這種方法的缺點是,如果您想DerivedClass稍后派生另一個類,則必須提供DerivedClass類似的建構式來傳遞新類的型別,例如:
class BaseClass {
public:
BaseClass(ClassType classType = BaseType) : classType(classType) {}
ClassType getClassType() { return classType; }
private:
ClassType classType;
};
class DerivedClass : public BaseClass {
public:
BaseClass(ClassType classType = DerivedType) : classType(classType) {}
};
class AnotherClass : public DerivedClass {
public:
AnotherClass() : DerivedClass(AnotherType) {}
};
否則,您可以離開virtual,getClassType()并完全擺脫該classType成員。只需讓BaseClassand DerivedClass(以及任何后續類)覆寫getClassType()以直接回傳它們各自的型別,例如:
class BaseClass {
public:
virtual ClassType getClassType() { return BaseType; }
};
class DerivedClass : public BaseClass {
public:
ClassType getClassType() override { return DerivedType; }
};
class AnotherClass : public DerivedClass {
public:
ClassType getClassType() override { return AnotherType; }
};
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/519731.html
標籤:C 遗产虚函数
下一篇:mypy和基本繼承
