Çözüldü C++ ana sınıftan türetilen sınıfın elemanlarına erişilebilir mi?

Bu konu çözüldü olarak işaretlenmiştir. Çözülmediğini düşünüyorsanız konuyu rapor edebilirsiniz.

Musa B.

Kilopat
Katılım
1 Ekim 2017
Mesajlar
1.633
Makaleler
4
Çözümler
13
Daha fazla  
Cinsiyet
Erkek
Merhaba, geçen gün yapmış olduğumuz bir ödevde kendim "base class" ögemden türetilmiş sınıfımdaki public fonksiyon ve üyelere erişmeyi denediğimde başaramamıştım ve hocama sorduğumda bunun yapılabileceğini söylemişti ve kodu atmamı kendisinin düzelteceğini söylemişti. Kendisinin düzelttiği kodda da ürettiği obje türetilmiş sınıftan olduğundan erişebiliyordu. Objeyi ana sınıftan oluşturursam yine erişim sağlayamıyordum. Sırayla açıklamam gerekirse;

1- Shape adında bir base class var.
2- 3DShape diye türetilmiş sınıfımız var ve bu sınıfın alanı döndüren getAlan adında bir fonksiyonu var.
3- Ödevde Shape küp olarak bir sınıf tanımlamamız isteniyor ve bununla küp.getAlan yaparak alanına erişmemiz isteniyordu.
4- Shape olarak değil de 3DShape olarak objeyi tanımladığımda (3DShape küp) getAlan´a erişebiliyordum.

Sonuç olarak hala kafamda oturtamadım bu durumu. Base class üzerinden türetilmiş sınıfın üyelerine erişebilir miyim?
 
Son düzenleyen: Moderatör:
Çözüm
Java tabanlı birisi olduğum için bana "Base" demek ters geliyor bu yüzden yazının devamında Super görürseniz o base demek.

Uzmanlık alanım Java, C# ve Typescript/Javascript olduğu için örneği C++ yerine Java üzerinden vereceğim.

Sub class üzerinde var olup Super class'da bulunmayan bir methoda Super Class tipinden erişilmez. Ancak. Bahsi geçen getAlan methodu abstract ise Super üzerinden tanımlı olmasa bile kendisi kalıtan Sub class üzerinde tanımlı olacağı için Polymorphism gereği Super Class tipi ile çağrılıp kullanılabilir.

Bkz. basit bir örnek.

Java:
public static void main(String[] args)
{
  Shape3D my3DShape = new Shape3D(10, 20, 30);
  Shape shapeHolder = my3DShape;
  double area = shapeHolder.getArea();
  // Veya
  double area2 = ((Shape) my3DShape).getArea();
  // Veya
  Shape shape = new Shape3D(5, 10, 15);
  double area3 = shape.getArea();
}


public class Shape3D extends Shape
{

  private double width, height, depth;

  public Shape3D(double width, double height, double depth)
  {
    super("3D SHAPE");
    this.width = width;
    this.height = height;
    this.depth = depth;
  }

  public double getWidth()
  {
    return width;
  }

  public double getHeight()
  {
    return height;
  }

  public double getDepth()
  {
    return depth;
  }

  @Override
  public double getArea()
  {
    return this.width * this.height * this.depth;
  }
}

public abstract class Shape
{

  protected String name;

  public Shape(String name)
  {
    this.name = name;
  }

  public String getName()
  {
    return name;
  }

  public abstract double getArea();
}
Kodu atarsan daha objektif bir yorum yapma fırsatımız olacaktır dostum fakat bence buradaki kalıtılan sınıf bir "abstract" sınıf. Yani fonksiyonları virtual fonksiyon ve eğer değişken varsa da static bir değişken olabileceğini düşünüyorum.
 
Kodu atarsan daha objektif bir yorum yapma fırsatımız olacaktır dostum fakat bence buradaki kalıtılan sınıf bir "abstract" sınıf. Yani fonksiyonları virtual fonksiyon ve eğer değişken varsa da static bir değişken olabileceğini düşünüyorum.
Kullandığı türetilen sınıf için terim "derived"di hocam. Kodu ne yazık ki sildim. Bugün sınavımız var ve olası bir soru gelme ihtimaline karşı aklıma takıldı bu durum. Kendim bu konuyu açtıktan sonra bir kod yazıp denediğimde erişemedim ögelere.
 
Kullandığı türetilen sınıf için terim "derived"di hocam. Kodu ne yazık ki sildim. Bugün sınavımız var ve olası bir soru gelme ihtimaline karşı aklıma takıldı bu durum. Kendim bu konuyu açtıktan sonra bir kod yazıp denediğimde erişemedim ögelere.
@The Anorak hocamız gerekli cevabı vermiş.
 
Base class üzerinden türetilmiş sınıfın üyelerine erişebilir miyim?

Ne demek istediğini tam olarak anlamadım Base class üzerinden child classlara erişemezsin ancak parent classlar üzerinden base class'a erişebilirsin ve erişebilmen için base classın public olarak declare edilmesi gerekir.
 
"Base class üzerinden türetilmiş sınıfın üyelerine, erişebilir miyim?" başka "Base class üzerinden, türetilmiş sınıfın üyelerine erişebilir miyim?" başka şey.

Virgül kullanın.

İlk cümlenizdeki hikayeye göre sub üzerinden, super(base)'in üyelerine erişmek istemişsiniz. Hocanız da bunun mümkün olduğunu belirtmiş. Ki öyle.
 
Java tabanlı birisi olduğum için bana "Base" demek ters geliyor bu yüzden yazının devamında Super görürseniz o base demek.

Uzmanlık alanım Java, C# ve Typescript/Javascript olduğu için örneği C++ yerine Java üzerinden vereceğim.

Sub class üzerinde var olup Super class'da bulunmayan bir methoda Super Class tipinden erişilmez. Ancak. Bahsi geçen getAlan methodu abstract ise Super üzerinden tanımlı olmasa bile kendisi kalıtan Sub class üzerinde tanımlı olacağı için Polymorphism gereği Super Class tipi ile çağrılıp kullanılabilir.

Bkz. basit bir örnek.

Java:
public static void main(String[] args)
{
  Shape3D my3DShape = new Shape3D(10, 20, 30);
  Shape shapeHolder = my3DShape;
  double area = shapeHolder.getArea();
  // Veya
  double area2 = ((Shape) my3DShape).getArea();
  // Veya
  Shape shape = new Shape3D(5, 10, 15);
  double area3 = shape.getArea();
}


public class Shape3D extends Shape
{

  private double width, height, depth;

  public Shape3D(double width, double height, double depth)
  {
    super("3D SHAPE");
    this.width = width;
    this.height = height;
    this.depth = depth;
  }

  public double getWidth()
  {
    return width;
  }

  public double getHeight()
  {
    return height;
  }

  public double getDepth()
  {
    return depth;
  }

  @Override
  public double getArea()
  {
    return this.width * this.height * this.depth;
  }
}

public abstract class Shape
{

  protected String name;

  public Shape(String name)
  {
    this.name = name;
  }

  public String getName()
  {
    return name;
  }

  public abstract double getArea();
}
 
Son düzenleme:
Çözüm

Geri
Yukarı