Hvorfor får jeg ingen compiler warning?
Nedenfor er der 2 kode eksempler. Jeg synes at jeg burde få en warning når jeg kompilerer det første eksempel.Hvad er det jeg lige har overset?
Hvorfor give det første eksempel ingen warning?
Compiler: Borland CBuilder6
Kode eksempel 1:
//---------------------------------------------------------------------------
#include <iostream>
class A
{
public:
A() {}
A(const A&) {}
virtual ~A() {}
A& operator=(const A&) {return *this;}
void f()
{std::cout << "A::f" << std::endl;}
};
class B : public A
{
public:
B() {}
B(const B& b) : A(b) {}
virtual ~B() {}
B& operator=(const B& b) {A::operator=(b); return *this;}
void f()
{std::cout << "B::f" << std::endl;}
};
int main(int argc, char* argv[])
{
A a;
B b;
a.f();
b.f();
A& ar = b;
ar.f();
return 0;
}
//---------------------------------------------------------------------------
Hvis jeg compiler dette får jeg ingen warnings.
Output bliver:
A::f
B::f
A::f (Arrg, bang jeg er død)
Kode eksempel 2: (samme som før men A::f er virtual)
//---------------------------------------------------------------------------
#include <iostream>
class A
{
public:
A() {}
A(const A&) {}
virtual ~A() {}
A& operator=(const A&) {return *this;}
virtual void f()
{std::cout << "A::f" << std::endl;}
};
class B : public A
{
public:
B() {}
B(const B& b) : A(b) {}
virtual ~B() {}
B& operator=(const B& b) {A::operator=(b); return *this;}
void f()
{std::cout << "B::f" << std::endl;}
};
int main(int argc, char* argv[])
{
A a;
B b;
a.f();
b.f();
A& ar = b;
ar.f();
return 0;
}
//---------------------------------------------------------------------------
Output bliver:
A::f
B::f
B::f (det var meget bedre!)