Add a constructor to Base class
#include <iostream>
#include <cstring>
using namespace std;
class Shape {
// private
double width;
double height;
public:
Shape(double w, double h) {
width = w;
height = h;
}
void display() {
cout << "Width and height are " << width << " and " << height << "\n";
}
double getWidth() { return width; }
double getHeight() { return height; }
void setWidth(double w) { width = w; }
void setHeight(double h) { height = h; }
};
class Triangle : public Shape {
char style[20]; // now private
public:
Triangle(char *str, double w, double h) : Shape(w, h) {
strcpy(style, str);
}
double area() {
return getWidth() * getHeight() / 2;
}
void showStyle() {
cout << "Triangle is " << style << "\n";
}
};
int main() {
Triangle t1("isosceles", 4.0, 4.0);
Triangle t2("right", 8.0, 12.0);
cout << "Info for t1:\n";
t1.showStyle();
t1.display();
cout << "Area is " << t1.area() << "\n";
t2.showStyle();
t2.display();
cout << "Area is " << t2.area() << "\n";
return 0;
}
Info for t1:
Triangle is isosceles
Width and height are 4 and 4
Area is 8
Triangle is right
Width and height are 8 and 12
Area is 48
Add a overloaded constructor to base class
#include <iostream>
#include <cstring>
using namespace std;
class Shape {
// private
double width;
double height;
public:
Shape() {
width = height = 0.0;
}
Shape(double w, double h) {
width = w;
height = h;
}
Shape(double x) {
width = height = x;
}
void display() {
cout << "Width and height are " << width << " and " << height << "\n";
}
double getWidth() { return width; }
double getHeight() { return height; }
void setWidth(double w) { width = w; }
void setHeight(double h) { height = h; }
};
class Triangle : public Shape {
char style[20]; // now private
public:
/* A default constructor. This automatically invokes
the default constructor of Shape. */
Triangle() {
strcpy(style, "unknown");
}
Triangle(char *str, double w, double h) : Shape(w, h) {
strcpy(style, str);
}
Triangle(double x) : Shape(x) {
strcpy(style, "isosceles");
}
double area() {
return getWidth() * getHeight() / 2;
}
void showStyle() {
cout << "Triangle is " << style << "\n";
}
};
int main() {
Triangle t1;
Triangle t2("right", 8.0, 12.0);
Triangle t3(4.0);
t1 = t2;
cout << "Info for t1: \n";
t1.showStyle();
t1.display();
cout << "Area is " << t1.area() << "\n";
t2.showStyle();
t2.display();
cout << "Area is " << t2.area() << "\n";
t3.showStyle();
t3.display();
cout << "Area is " << t3.area() << "\n";
return 0;
}
Info for t1:
Triangle is right
Width and height are 8 and 12
Area is 48
Triangle is right
Width and height are 8 and 12
Area is 48
Triangle is isosceles
Width and height are 4 and 4
Area is 8
Call base"s default constructor automatically
#include <iostream>
#include <cstring>
using namespace std;
class Shape {
// private
double width;
double height;
public:
Shape() {
width = height = 0.0;
}
Shape(double w, double h) {
width = w;
height = h;
}
Shape(double x) {
width = height = x;
}
void display() {
cout << "Width and height are " << width << " and " << height << "\n";
}
double getWidth() { return width; }
double getHeight() { return height; }
void setWidth(double w) { width = w; }
void setHeight(double h) { height = h; }
};
class Triangle : public Shape {
char style[20]; // now private
public:
/* A default constructor. This automatically invokes
the default constructor of Shape. */
Triangle() {
strcpy(style, "unknown");
}
Triangle(char *str, double w, double h) : Shape(w, h) {
strcpy(style, str);
}
Triangle(double x) : Shape(x) {
strcpy(style, "isosceles");
}
double area() {
return getWidth() * getHeight() / 2;
}
void showStyle() {
cout << "Triangle is " << style << "\n";
}
};
int main() {
Triangle t1;
Triangle t2("right", 8.0, 12.0);
Triangle t3(4.0);
t1 = t2;
cout << "Info for t1: \n";
t1.showStyle();
t1.display();
cout << "Area is " << t1.area() << "\n";
t2.showStyle();
t2.display();
cout << "Area is " << t2.area() << "\n";
t3.showStyle();
t3.display();
cout << "Area is " << t3.area() << "\n";
return 0;
}
Info for t1:
Triangle is right
Width and height are 8 and 12
Area is 48
Triangle is right
Width and height are 8 and 12
Area is 48
Triangle is isosceles
Width and height are 4 and 4
Area is 8
Call base virtual function explicitly
#include <iostream>
using namespace std;
class Base {
public:
virtual void foo( ) {cout << "Base::foo( )" << endl;}
};
class Derived : public Base {
public:
virtual void foo( ) {cout << "Derived::foo( )" << endl;}
};
int main( ) {
Derived* p = new Derived( );
p->foo( ); // Calls the derived version
p->Base::foo( ); // Calls the base version
}
Derived::foo( )
Base::foo( )
Pass parameter to two base classes
#include <iostream>
using namespace std;
class base1 {
protected:
int i;
public:
base1(int x) {
i=x;
cout << "Constructing base1\n";
}
~base1() {
cout << "Destructing base1\n";
}
};
class base2 {
protected:
int k;
public:
base2(int x) {
k=x;
cout << "Constructing base2\n";
}
~base2() {
cout << "Destructing base2\n";
}
};
class derived: public base1, public base2 {
int j;
public:
derived(int x, int y, int z): base1(y), base2(z){
j=x;
cout << "Constructing derived\n";
}
~derived() {
cout << "Destructing derived\n";
}
void show() {
cout << i << " " << j << " " << k << "\n";
}
};
int main()
{
derived ob(3, 4, 5);
ob.show();
return 0;
}
Constructing base1
Constructing base2
Constructing derived
4 3 5
Destructing derived
Destructing base2
Destructing base1
Virtual base classes
#include <iostream>
using namespace std;
class base {
public:
int i;
};
class derived1 : virtual public base {
public:
int j;
};
class derived2 : virtual public base {
public:
int k;
};
/* derived3 inherits both derived1 and derived2.
This time, there is only one copy of base class. */
class derived3 : public derived1, public derived2 {
public:
int sum;
};
int main()
{
derived3 ob;
ob.i = 10; // now unambiguous
return 0;
}