...
| Code Block | ||||
|---|---|---|---|---|
| ||||
class B {
public:
B() { seize(); }
virtual ~B() { release(); }
protected:
virtual void seize() {}
virtual void release() {}
};
class D : public B {
public:
D() {}
~D() {}
protected:
void seize() {
B::seize();
// get derived resources...
}
void release() {
// release derived resources...
B::release();
}
};
D x;
|
...
| Code Block | ||||
|---|---|---|---|---|
| ||||
class B {
public:
B() {
// seize base resources...
}
virtual ~B() {
// release base resources...
}
};
class D : public B {
public:
D() {
// seize derived resources...
}
~D() {
// release derived resources...
}
};
D x;
|
...
| Code Block | ||||
|---|---|---|---|---|
| ||||
class A {
A() {
// f(); // WRONG!
A::f(); // okay
}
virtual void f();
};
|
...
Rule | Severity | Likelihood | Remediation Cost | Priority | Level |
|---|---|---|---|---|---|
OOP30-CPP | low | unlikely | medium | P2 | L3 |
Automated Detection
Tool | Version | Checker | Description | ||||||
| 4260,4261,4273,4274, 4275,4276,4277,4278, 4279,4280,4281,4282 |
Bibliography
[Dewhurst 03] Gotcha 75: Calling Virtual Functions in Constructors and Destructors
[Sutter 04] Item 49: Avoid calling virtual functions in constructors and destructors.
[Lockheed Martin 05] AV Rule 71.1 A class’s virtual functions shall not be invoked from its destructor or any of its constructors.
...
OOP07-CPP. Do not inherit from multiple classes that have distinct objects with the same name 13013. Object Oriented Programming (OOP) OOP31DCL34-CPP. Ensure object construction invocations isn't mistaken for a function variable declarationDo not write syntactically ambiguous declarations