• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 1167
  • Last Modified:

C++ Object Instantiation

What's the difference between the following statements in C++ and the proper situations in which one would be used over the others?

Base *obj = new Derived();
Derived *obj = new Base();
Derived *obj = new Derived();

Does it affect the way you would call a method? (i.e. obj->someMethod() )?  Let's say the method only existed in the derived class.  How does that change things?

Note:  I will be away from a computer for a while so I won't be able to respond to posts until tomorrow :-)
0
cuziyq
Asked:
cuziyq
2 Solutions
 
margajet24IT Business AnalystCommented:
if your are using the "Base" as the data type and you want to call a "SubClass" function, you need to type cast it to the "SubClass" to be able to have the access right to the function.

you use the Base Class if you are not yet sure which subclass to type cast to.. since Subclass inherits from the Base Class, casting from BaseClass to SubClass is possible..

one example maybe for this is when you use a Factory Design Pattern
0
 
Andrew_LvovCommented:
a) You won't be able to execute Derived *obj = new Base(), because object of Class base is not  Derived, vice versa is true.
b) The difference between 1. and 3. is in non-virtual functions call. Let's say void f() is non-virtual function defined in both Base and Derived classes. Then the next calls will execute f() from Base and from Derived respectively:

Base* b = new Derived();
Derived* d = new Derived();
b->f();     // would call Base::f()
d->f();     // would call Derived::f()

Open in new window

0
 
Andrew_LvovCommented:
Oh, and of course if der() is not defined in Base, you'll have a compilation error trying to call:
class Base
{
  void f();
};
 
class Derived : public Base
{
  void f();  // override, but non-virtual
  void der();
};
 
main()
{
  Base* b = new Derived();
  b -> der();     // would lead to compilation error
 
  return 0;
}

Open in new window

0
Cloud Class® Course: CompTIA Healthcare IT Tech

This course will help prep you to earn the CompTIA Healthcare IT Technician certification showing that you have the knowledge and skills needed to succeed in installing, managing, and troubleshooting IT systems in medical and clinical settings.

 
rstaveleyCommented:
Best to experiment. The following shows you some static invocation too...
#include <iostream>
#include <string>
using std::string;
using std::cout;
 
class base;
std::ostream& operator<<(std::ostream& os,const base& b);
class base {
	string name;
	friend std::ostream& operator<<(std::ostream& os,const base& b);
public:
	void f() {
		cout << *this << ".base::f()\n";
	}
	virtual void v() {
		cout << *this << ".base::v()\n";
	}
	base(const string& name) : name(name) {}
	virtual ~base() {}
};
 
std::ostream& operator<<(std::ostream& os,const base& b)
{
	return os << b.name;
}
 
class derived : public base {
	string name;
	friend std::ostream& operator<<(std::ostream& os,const base& b);
public:
	void f() {
		cout << *this << ".derived::f()\n";
	}
	virtual void v() {
		cout << *this << ".derived::v()\n";
	}
	derived(const string& name) : base(name) {}
};
 
int main()
{
	{
		base *obj = new base("alpha-base");
		obj->f();
		obj->v();
		obj->base::f();
		obj->base::v();
		delete obj;
	}
	{
		derived *obj = new derived("beta-derived");
		obj->f();
		obj->v();
		obj->base::f();
		obj->base::v();
		obj->derived::f();
		obj->derived::v();
		delete obj;
	}
	{
		base *obj = new derived("gamma-derived");
		obj->f();
		obj->v();
		obj->base::f();
		obj->base::v();
		//obj->derived::f();	// Compiler error
		//obj->derived::v();	// Compiler error
		delete obj;
	}
	
}

Open in new window

0
 
rstaveleyCommented:
Seriously though my point is  that you'll understand and learn this stuff best by experimentation. See what happens when you invoke virtual and non-virtual functions in a polymorphic object. See what happens when the static type is base and when the static type is derived. It is much better learning that way than hearing about it from know-it-alls like me.
0
 
evilrixSenior Software Engineer (Avast)Commented:
The behavior you see when calling a method on a base class will depend on whether that method is virtual or not. If it is you'll get polymorphic behavior.
http://www.cplusplus.com/doc/tutorial/polymorphism.html
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Free Tool: Site Down Detector

Helpful to verify reports of your own downtime, or to double check a downed website you are trying to access.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now