When I first met the use of the keyword finalin combination with virtualin C ++, I was interested in the same thing:
virtual final , ?
, , , .
:
class A {
public:
void hide_me();
virtual void override_me();
virtual void cant_override_me() final;
};
, .
:
void hide_me();
, , .
:
virtual void cant_override_me() final;
final , , .
, hide_me , , cant_override_me ( virtual,) , - final. , , virtual, virtual, , final.
:
class B: public A {
public:
void hide_me();
void override_me();
};
hide_me() B, , , . B A hide_me A::hide_me(), -, B, B, :
B *my_b = new B();
A hide_me my_b->A::hide_me().
cant_override_me() B.
, , , :
#include <cstdio>
class A {
public:
inline void hide_me() {
printf("a hide_me\n");
}
virtual void override_me();
virtual void cant_override_me() final;
};
class B: public A {
public:
inline void hide_me() {
printf("b hide_me\n");
}
void override_me();
inline void foo() {
A::hide_me();
}
};
void A::override_me() {
printf("a override_me\n");
}
void A::cant_override_me() {
printf("a cant_override_me\n");
}
void B::override_me() {
printf("b override_me\n");
}
int main (int argc, char *argv[]) {
A *a = new A();
A *ab = new B();
B *b = new B();
a->hide_me();
ab->hide_me();
b->hide_me();
b->A::hide_me();
printf("---\n");
a->override_me();
ab->override_me();
b->override_me();
b->A::override_me();
}
a hide_me
a hide_me
b hide_me
a hide_me
---
a override_me
b override_me
b override_me
a override_me