0%

override & final in C++11

這兩個特色很少被提及,寫起來,免得忘了。

final

如何防止一個類別被繼承(雖然我想不到為什麼要這麼作),以前可以用虛擬繼承來防止。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
template <typename T>
class Base {
friend typename T;
private:
Base() {}
};
class Derived : public virtual Base <Derived> {
public:
Derived() :Base() {}
};
class MoreDerived : public Derived {
public:
MoreDerived() :Derived() {}
};

其中的MoreDerived就被編譯器禁止生成。不過這樣寫實在很麻煩,於是在C++11之後友更簡單的方式。

1
2
3
4
5
6
7
8
class Base final {
public:
Base() {}
};
class Derived : public Base {
public:
Derived() {}
};

這邊只要加上final關鍵自救能達到一樣的效果。等同於C#的sealed
同樣的,C++11也從C#跟Java借鑒了不少特色

防止虛擬函數函數被override

1
2
3
4
5
6
7
8
9
10
class Base {
public:
Base() {}
virtual void show() final {}
};
class Derived : public Base {
public:
Derived() {}
void show() {} // Compile error
};

override

override顧名思義就是檢查BaseClass之中,有沒有同樣Signature的函式宣告,如果沒有的話,就會爆錯。免得產生新的函數而不自知。

1
2
3
4
5
6
7
8
9
class Base {
public:
virtual void show(int) {}
};
class Derived : public Base {
public:
void show(int) override {}
void show(double) override {} // Compile error
};

在上面的例子中,可以看到Base沒有show(double)這個Signature的宣告,因此Compiler會報錯。
因此我們可以透過 pure virtual function在編譯時檢查每個subclass都有實做此函數,而用override來檢查這函數是在VTable中。