class Temp
{
private:
~Temp() {}
friend class Final;
};
class Final : virtual public Temp
{
public:
void fun()
{
cout<<"In base";
}
};
class Derived : public Final
{
};
void main()
{
Derived obj;
obj.fun();
}
The above code tries to achieve non-inheritable class (final). But using above code the object of derived can still be created, why?
The desired functionality is achieved only if ctor made private, my question is why it is not achievable in case of dtor private?
A final class is a class that can't be extended. Also methods could be declared as final to indicate that cannot be overridden by subclasses. Preventing the class from being subclassed could be particularly useful if you write APIs or libraries and want to avoid being extended to alter base behaviour.
March 2nd, 20208 0. The final specifier in C++ marks a class or virtual member function as one which cannot be derived from or overriden. For example, consider the following code: struct base { virtual void f() const = 0; }; struct derived final : base { void f() const override {} };
The final class is a class that is declared with the final keyword. We can restrict class inheritance by making use of the final class. final class means that the class cannot be extended or inherited. If we try to inherit a final class, then the compiler throws an error during compilation.
To declare a final variable, use the final keyword in the variable declaration before the type: final int aFinalVar = 0; The previous statement declares a final variable and initializes it, all at once. Subsequent attempts to assign a value to aFinalVar result in a compiler error.
Well, for this program (pleasse provide correct, compilable examples)
#include <iostream>
class Temp
{
private:
~Temp() {}
friend class Final;
};
class Final : virtual public Temp
{
public:
void fun() { std::cout<<"In base"; }
};
class Derived : public Final {};
int main() {
Derived obj;
obj.fun();
}
Comeau Online says
Comeau C/C++ 4.3.10.1 (Oct 6 2008 11:28:09) for ONLINE_EVALUATION_BETA2
Copyright 1988-2008 Comeau Computing. All rights reserved.
MODE:strict errors C++ C++0x_extensions
"ComeauTest.c", line 16: error: "Temp::~Temp()" (declared at line 6) is inaccessible
class Derived : public Final {
^
detected during implicit generation of "Derived::Derived()" at line
21
"ComeauTest.c", line 16: error: "Temp::~Temp()" (declared at line 6) is inaccessible
class Derived : public Final {
^
detected during implicit generation of "Derived::~Derived()" at line
21
2 errors detected in the compilation of "ComeauTest.c".
Since, when in doubt, I always trust como (I have only ever found one error in it, but many in other compilers), I suppose VC9 (which accepts the code) is in error. (From that void main()
I suppose you use VC, too.)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With